ECMAScript 中有五种简单数据类型(基本数据类型):Undefined、Null、Boolean、Number 和 String。还有一种复杂数据模型:Object。
数据类型
1 typeof 操作符
typeof 用来检测给定变量的数据类型。对一个值使用 typeof 操作符可能返回下列某个字符串:
- “undefined”——如果这个值未定义;
- “boolean”——如果这个值是布尔值;
- “string”——如果这个值是字符串;
- “number”——如果这个值是数值;
- “object”——如果这个值是对象或者null;
- “function”——如果这个值是函数;
2 Undefined 类型
Undefined 类型只有一个值,即特殊的 undefined。在使用 var 声明变量但未对其初始化时,这个变量的值就是 undefined。
- 字面值 undefined 主要目的是用于比较。
- 对未初始化的变量和未声明的变量执行 typeof 操作符都会返回 undefined 值。
- 建议显式的初始化变量,这样当 typeof 操作符返回 undefined 值时,我们可以知道被检测变量还未被声明,而不是尚未初始化。
3 Null 类型
Null 类型同样只有一个值——特殊的值 null。从逻辑角度看,null 值表示一个空对象指针,因此使用 typeof 操作符检测 null 值时会返回 object。
- 如果定义的变量准备将来用于保存对象,那么最好将该变量初始化为 null。
- undefined 值是派生自 null 值的,因此ECMA-262 规定对他们的相等性测试要返回 true:
alert(null == undefined); //true
4 Boolean 类型
Boolean 类型是 ECMAScript 中使用最多的一种类型,该类型只有两个字面值:true 和 false。
- 与数字值不是一回事,true 不一定等于 1,false 也不一定等于 0。
- 区分大小写,True 和 False 都不是 Boolean 值,只是标识符。
- 要将一个值转换为对应的 Boolean 值,可以调用转型函数 Boolean( )。对于各种类型的规则如下:
数据类型 转换为 true 的值 转换为 false 的值 Boolean true false String 任何非空字符串 “”(空字符串) Number 任何非零数字值(包括无穷) 0 和 NaN Object 任何对象 null Undefined 不适用 undefined
5 Number 类型
Number 类型使用 IEEE754 格式来表示整数和浮点数值。
- 八进制子面值第一位必须为 0 ,然后是八进制数字序列(0~7),如果字面值中数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值解析。
var octalNum1 = 070; // 八进制的 56 var octalNum2 = 079; // 无效的八进制数值——解析为 79 var octalNum1 = 08; // 无效的八进制数值——解析为 8
- 十六进制字面值前两位必须为 0x ,后跟任何十六进制数字。
5.1 浮点数值
- 当浮点数中小数点后没有数字时,ECMAScript 会自动将浮点数转换为整数。
- 对于极大极小值可以用 e 表示法(科学计数法),例如:
var floatNum = 3.125e7; // 等于 31250000
- 永远不要测试某个特定的浮点数值,所有基于 IEEE754 数值的浮点计算都会出现这种问题。例如:
alert(0.1+0.2==0.3) // false
5.2 数值范围
- 如果某次计算的结果得到一个超出 JavaScript 数值范围的值,那么这个值会被自动转换为特殊的 Infinity 值,负数会转换为 -Infinity。
- 判断一个数值是不是有穷的可以通过 isFinite( )函数,有穷会返回 true。
5.3 NaN
NaN,即非数值(Not a Number)是一个特殊的数值,用于表示一个本来要返回数值的操作数未返回数值的情况。
- 任何涉及 NaN 的操作都会返回 NaN
- NaN 与任何值都不相等,包括 NaN 本身。
alert(NaN == NaN); // false
5.4 数值转换
有 3 个函数可以把非数值转换为数值:Number( )、parseInt( )、parseFloat( )。第一个可用于任何数据类型,后两个针对字符串转换成数值。
Number( )函数转换规则:
- Boolean值,true 和 false 分别转换为 1 和 0。
- 数字值,简单的传入和返回。
- null 值,返回 0 。
- undefined 值,返回 NaN。
- 字符串:
- 只包含数字,转换为十进制数字,即"123"变为 123,"011"变为 11。
- 包含有效浮点格式,转换为对应浮点值。
- 包含有效十六进制格式,转换为对应的十进制整数值。
- 空串转换为 0。
- 除此之外转换为 NaN。
- 如果是对象,调用对象的 valueOf( )方法,再依照前面规则转换。
parseInt( )函数转换规则
- 忽略字符串前面的空格,找到第一个非空格字符,如果不是数字或负号,返回 NaN。如果第一个字符是数字字符,会继续向后解析,直到没有后续字符或者遇到非数字字符停止。例如:
var num1 = parseInt("1234blue"); // 1234 var num2 = parseInt(""); // NaN var num3 = parseInt("0xA"); // 10(十六进制) var num4 = parseInt(22.5); // 22
- 这个函数提供第二个参数:转换时使用的基数(即多少进制)
var num1 = parseInt("0xAF", 16); // 175 var num2 = parseInt("AF", 16); // 175
parseFloat( )函数与parseInt( )规则类似,但是只能解析十进制。
6 String 类型
String 类型可以由双引号和单引号表示,两者没有任何区别。
- 转义序列:
字面量 含义 \n 换行 \t 制表 \b 退格 \r 回车 \f 进纸 \\ 斜杠 \’ 单引号 \" 双引号 \xnn 用十六进制代码 nn 表示一个字符 \unnnn 用十六进制代码 nnnn 表示一个 Unicode 字符 - 任何一个字符串都可以通过 length 属性获得长度
- 如果字符串中包含双字节符,那么 length 属性可能会不准确
- ECMAScript 中的字符串是不可变的,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
转换字符串
- toString( ):除 null 和 undefined 值外都具有toString( )方法。
- 当数值调用此方法时,可以传递参数(输出数值的基数)指定进制:
var num = 10; alert(num.toString()); // "10" alert(num.toString(2)); // "1010" alert(num.toString(8)); // "12" alert(num.toString(16)); // "a"
- String( ):可以将任何类型的值转换为字符串。
- 有 toString( )方法,调用 toString( )方法;
- null 返回"null";
- undefined 返回"undefined"。
7 Object 类型
ECMAScript 中的对象其实就是一组数据和功能的集合。对象可以通过执行 new 操作符后跟要创建的对象类型的名称来创建。而创建 Object 类型的实例并为其添加属性和(或)方法,就可以创建自定义对象。
var o = new Object();
var o = new Object; // 有效,但不推荐
Object 的每个实例都具有下列属性和方法
- constructor: 保存着用于创建当前对象的函数。
- hasOwnProperty(propertyName): 用于检查给定的属性在当前对象实例中是否存在。
- isPrototypeOf(Object): 用于检查传入的对象是否是当前对象的原型。
- propertyIsEnumerable(propertyName): 用于检查给定的属性能否用 for-in 语句来枚举。
- toLocaleString(): 返回对象的字符串表示,该字符串与执行环境的地区对应。
- toString(): 返回对象的字符串表示。
- valueOf(): 返回对象的字符串、数值或布尔值表示。