数据类型
ECMAScript中有5种基本数据类型:Undefined、Null、Boolean、Number和String。还有1种复杂数据类型:Object。
注意:和其它语言不同,String是基本数据类型,不是引用数据类型。
typeof操作符
用来检测给定变量的数据类型。对一个值使用typeof,可能返下列某个字符串:
- “undefined”————如果这个值未定义;
- “boolean”————如果这个值是布尔值;
- “string”————如果这个值是字符串;
- “number”————如果这个值是数值;
- “object”————如果这个值是对象或null;
- “function”————如果这个值是函数。
var message = "some string";
alert(typeof message); // "string"
alert(typeof(message)); // "string"
alert(typeof 95); // "number"
typeof是一个操作符而不是函数,因此例子中的圆括号虽然可以用,但不是必需的。
Undefined类型
Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。
var message;
alert(message == undefined); // true
不过尚未初始化的变量与尚未定义的变量是不一样的。
var message;
alert(message); // "undefined"
alert(age); // error
对未初始化的变量和未定义的变量执行typeof操作符都会返回undefined。
var message;
alert(typeof message); // "undefined"
alert(typeof age); // "undefined"
即便未初始化的变量会自动被赋予undefined值,但显式地初始化变量依然是明智的选择。如果能够做到这一点,那么当typeof操作符返回”undefined”时,我们就知道被检测的变量还没有被声明,而不是尚未初始化。
Null类型
Null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null值表示空对象指针,而这也正是使用typeof null时返回”object”的原因。
var message = null;
alert(typeof message); // "object"
如果定义的变量是用来保存对象的,那么最好将该变量初始化为null。 这样,只要直接检查null值就可以知道比阿尼浪是否已经保存了一个对象的引用。
if(car != null){
// 业务逻辑
}
只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。
Boolean类型
Boolean类型只有两个值:true和false。这两个值与数字值不是一回事,因此true不一定等于1,而false也不一定等于0。
ECMAScript中所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean()。可以对任何数据类型的值调用Boolean(),而且总会返回一个Boolean值。
下表给出了各种数据类型及其对应的转换规则:
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “”(空字符串) |
Number | 任何非零数值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | n/a | undefined |
这些转换规则对理解流控制语句(如if语句)自动执行相应的Boolean转换。
var message = "Hello world!";
if(message){
alert("Value is true"); // Value is true
}
Number类型
十进制
var intNum = 55; // 整数
八进制
var octalNum1 = 070; // 八进制的56
var octalNum2 = 079; // 解析为79
var octalNum3 = 08; // 解析为8
八进制字面值的第一位必须是0,然后是0 ~ 7。如果字面值的数值超出了范围,那么前导0将被忽略,后面的数值将被当作十进制数值解析。
十六进制
var hexNum1 = 0xA; // 十六进制的10
var hexNum2 = 0x1f; // 十六进制的31
十六进制字面值的前两位必须是0x,后跟0 ~ 9 及 A ~ F。
浮点数
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1; // 不推荐
科学计数法
var floatNum1 = 3.125e7; // 等于31250000
var floatNum2 = 3e-7; // 等于0.0000003
浮点数计算时的精确度有误差
var a = 0.1, b = 0.2;
if(a + b == 0.3){ // 0.1 + 0.2 = 0.30000000000000004
alert("You got 0.3.");
}
NaN
NaN,即非数值(Not a Number)是一个特殊的数值,这个数值表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。在ECMAScript中,任何数值除以0会返回NaN,因此不会影响其他代码的执行。
isNaN(),参数可以是任何类型,返回指定参数是否“不是数值”。
alert(isNaN(NaN)); // true
alert(isNan(10)); // false(10是一个数值)
alert(isNan("10")); // false(可以被转换成数值10)
alert(isNan("blue")); // true(不能转换成数值)
alert(isNan(true)); // false(可以被转换成数值1)
任何不能被转换为数值的值都会导致这个函数返回true。
数值转换
有3个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。
最常用的是parseInt()
* 它会忽略字符串前面的空格,直到找到第一个非空格字符;
* 如果第一个字符不是数字字符或者符号,parseInt()就会返回NaN;
* 如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。
var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六进制数)
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56(八进制数)
var num6 = parseInt("70"); // 70(十进制数)
var num7 = parseInt("0xF"); // 15(十六进制数)
parseInt()的第二个参数为转换时的进制。
var num1 = parseInt("0xAF", 16); // 175
parseFloat()
var num1 = parseFloat("1234blue"); // 1234
var num2 = parseFloat("0xA"); // 0
var num3 = parseFloat("22.5"); // 22.5
var num4 = parseFloat("22.34.5"); // 22.34
var num5 = parseFloat("0908.5"); // 908.5
var num6 = parseFloat("3.125e7"); // 31250000
parseFloat()只解析十进制值,其它进制的字符串会被转换成0。
String类型
字符串转换
.toString()
number、boolean、object和string都有toString()。但null和undefined值没有这个方法。
调用Number的toString()时,可以传一个参数:输出数值的进制。默认情况下.toString()以十进制格式返回数值的字符串表示。
var num = 10;
alert(num.toString()); // "10"
alert(num.toString(2)); // "1010"
alert(num.toString(8)); // "12"
alert(num.toString(10)); // "10"
alert(num.toString(16)); // "a"
String()
在不知道要转换的值是不是null或undefined的情况下,可以使用转型函数String(),这个函数可以将任何类型的值转换为字符串。
String()遵循以下转换规则:
* 如果值有toString(),则调用toString(),并返回相应的结果;
* 如果值是null,则返回”null”;
* 如果值是undefined,则返回”undefined”。
var value1 = 10;
var value2 = true;
var value3 = null;
var value4 = 10;
alert(String(value1)); // "10"
alert(String(value2)); // "true"
alert(String(value3)); // "null"
alert(String(value4)); // "undefined"
Object类型
属性和方法:
* constructor: 保存着用于创建当前对象的函数。
* hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。propertyName必须以字符串形式指定。
* isPrototypeOf(object):用于检查传入的对象是否是另一个对象的原型。
* propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。propertyName以字符串形式指定。
* toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
* toString():返回对象的字符串表示。
* valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()的返回值相同。