数据类型
ECMAScript 中有5中简单数据类型:Undefined、Null、Boolean、Number & String。一种复杂数据类型:Object。
1.3.1 typeof操作符
用于检测给定变量的数据类型。返回6中类型:undefined、boolean、string、number、object、function。
console.log(typeof null); //Object
PS: 特殊值 null 调用 typeof 会返回 Object。
1.3.2 Undefined类型
Undefined 类型只有一个值:undefined。声明变量但未初始化的变量的值就是 undefined。
var box;
console.log(typeof box); //Undefined
PS1: 未声明 和 声明了但没有初始化是不一样的
var message; //声明但未初始化
//var box; //未声明
alert(message); //undefined
alert(box); //报错
PS2: 使用 typeof 操作符检测 未声明或者声明了没有初始化的变量都返回 undefined
var message;
//var box;
alert(typeof message); //undefined
alert(typeof box); //undefined
1.3.3 Null类型
null 类型也只有一个值:null,表示一个空指针对象。如果定义的变量准备将来用于保存对象,最好将该变量初始化为 null 。
实际上,undefined 值是派生自 null 值的,因此它们两个是相等的。
console.log(undefined == null); //true
PS: 尽管 undefined 和 null 之间的相等操作符总是返回 true ,但他们的用途完全不一样。无论什么时候都没必要把一个变量的值显式的设置为 undefined,而只要意在保存对象的变量还没有真正的保存对象,就应该明确地让该变量保存 null 值。
1.3.4 Boolean类型
boolean 类型是使用最多的类型之一,有两个值:true 和 false。ECMAScript 中所有类型的值都有相应的 booloen 值,转换方法是使用 Boolean() 方法,规则如下:
| 数据类型 | 转换为true | 转换为false |
|---|---|---|
| Boolean | true | false |
| String | 任何非空字符串 | “”(空字符串) |
| Number | 任何非零数值 | 0或NaN(Not a Number) |
| Object | 任何对象 | null |
| Undefined | undefined |
console.log(Boolean('')); //false
console.log(Boolean(23)); //true
console.log(Boolean(null)); //false
这些转化规则对理解流控制语句自动执行相应的 Boolean 转换非常重要:
var box = 'hello';
if(box){
alert('box is defined');
}
1.3.5 Number类型
Number 类型是最令人关注的类型。
- 十进制: 最基本的数值字面量格式,不必多说;
- 八进制: 第一位必须是
0,后面的数字必须是0~7。超出范围则忽略前面的0。 - 十六进制: 前两为必须是
0x,后面跟0~9 a~f。超出范围报错。var num1 = 55; //十进制55 var num2 = 070; //八进制的56 var num3 = 079; //无效的八进制,解析为79 var num4 = 0xa; //十六进制10 var num5 = 0x1f; //十六进制31PS: 不管几进制,经过算数运算后都被转换为十进制。
前面提到的都是整数,下面说一下包含小数点的数值。
- 如果小数点后没有跟任何数字或跟着
0,都会被解析为整数;(保存浮点数需要的内存是整数的2倍) - 极大或极小的数值,使用科学记数法表示;
var floatNum1 = 12.0; //解析为12 var floatNum2 = 1.; //解析为1 var floatNum3 = 3.125e7; //等于31250000 var floatNum4 = 3e-7; //等于0.0000003
PS1: 浮点数的精度是 17 位小数(小数点后17位),在进行算数运算时后出现一些误差。例如:0.1 加 0.2 的值结果是 0.30000000000000004,而不是 0.3 。这个现象在很多编程语言中都存在,并非 ECMAScript 一家。解决办法就是永远不要测试某个特定的浮点数值。
console.log(0.1 + 0.2 == 0.3); //false数值范围: 由于内存限制,ECMAScript 并不能保存世界上所有的数值。最小值为
Number.MIN_VALUE = 5e-324;最大值为Number.MAX_VALUE = 1.7976931348623157e+308。如果某次计算结果超出了这个范围,将自动被转换为特殊值Infinity(无穷),并且不能参与后面的运算。
数值转换: 有3个函数可以将非数值转换为数值:Number()、parseInt() 和 parseFloat()。第一个可以转换任何数据类型,后两个专用于字符串的转换。
Number() 的转换规如下:(相对复杂并且不合理,所以不常用)
parseInt() 的转换规则:
- 空字符串转换为
NaN; - 第一个非空字符位数字时,继续往后解析,知道遇到非数字字符。
- 对特殊字符,使用第二个参数:转换时使用的进制。
var num1 = parseInt(''); //NaN var num2 = parseInt('123blue'); //1234 var num3 = parseInt('123.45'); //123 var num4 = parseInt('0xaf', 16); //175 var num5 = parseInt('af'); //NaNPS: parseFloat() 与 parseInt() 相似,只不过字符串中的第一个小数点有效,并且只解析十进制。
1.3.6 String类型
字符串可以用 单引号或双引号 表示。任何字符串使用 .length 方法都可以获得其长度。
将一个值转换为字符串有两种方式:toString()方法 和 String()函数(一般使用后者)。
- 如果值有 toString() 方法,则调用该方法,并返回相应结果;
- 如果值是 null ,返回 ‘null’;
- 如果值是 undefined ,返回 ‘undefined’。
PS: 使用加号操作符也可以把某个值与另一个值加在一起,返回一个字符串。
1.3.7 Object类型
对象其实就是一组数据和功能的集合。这里只介绍三个所有对象都会有的方法,其他内容后面将详细介绍。
- toLocaleString() 返回对象的字符串表示,该字符串与执行环境的地区对应
- toString() 返回对象的字符串表示
- valueOf() 返回对象的字符串、数值或布尔值表示。