ECMAScript 中有 5 种基本数据类型:。还有 1 种复杂数据类型—,Object 实质上是由一组无序的名值对 (键值对) 组成的。ECMAScript 不支持任何创建自定义类型的机制。
由于 ECMAScript 是松散型的,所以需要一种手段来检测变量的数据类型,typeof 就是具有这种功能的操作符。用 typeof 检测变量可能返回以下某个字符串:
"undefined" | 变量未定义 |
"boolean" | 变量是布尔值 |
"string" | 变量是字符串 |
"number" | 变量是数值 |
"object" | 变量是对象或者 null |
"function" | 变量是函数 |
从技术的角度讲,函数在 ECMAScript 中是对象,不是一种数据类型。然而,函数有一些特殊的属性,因此通过 typeof 来区分函数和其它对象是有必要的。
Undefined 类型只有一个值,就是特殊的。在使用 var 声明变量但未初始化时,这个变量的值就是 undefined,如:
- var a;
- alert(a == undefined); //true
不过,包含 undefined 值的变量和尚未定义的变量不一样,如:
- var a; // 这个变量声明之后默认取得了undefined值
- // 下面这个变量并没有声明
- // var b
- alert(a); // "undefined"
- alert(b); // 产生错误
然而对未声明或者声明没有初始化的变量使用 typeof 都会返回 undefined,如:
- var a;
- // var b;
- alert(typeof a); // "undefined"
- alert(typeof b); // "undefined"
Null 类型也只有一个值,就是。从逻辑的角度来看,null 值表示一个空指针,所以用 typeof 检测 null 值会返回 "object",如:
- var car = null;
- alert(typeof car); // "object"
所以如果要定义变量来存放对象,最好将该变量初始化为 null。实际上,undefined 值是继承自 null 值的,所以判断它们的相等性会返回 true:
- alert(null == undefined); // true
尽管 null 和 undefined 有这样的关系,但它们用途是完全不同的,因为无论什么时候都没有必要把一个变量的值显示的设置为 undefined,然而当定义一个还未保存对象的对象变量时,就应该将变量设置为 null,这样不仅可以体现 null 作为空对象的指针,还有能很好地区分 null 和 undefined。
Boolean 类型有两个字面值:和,但是 ECMAScript 中所有类型的值都能调用 Boolean() 函数转换成 Boolean 类型的值,下表列出了各种数据类型对应的转换规则:
数据类型 | 转换为 true 的值 | 转换为 false 的值 |
Boolean | true | false |
String | 任何非空字符串 | "" 空字符串 |
Number | 任何非零数字值 | 0 和 NaN |
Object | 任何对象 | null |
Undefined | / | undefined |
Number 类型分为整数和浮点数,整数可以用十进制,八进制或十六进制表示,如:
- var num1 = 22; //十进制整数
- var num2 = 070; //八进制的56
- var num3 = 079; // 无效的八进制,解析为十进制79
- var num4 = 08; //无效的八进制,解析为十进制8
- var num5 = 0xA; //十六进制的10
- var num6 = 0x1f; //十六进制的31
但是八进制字面量在严格模式下是无效的,在进行算数计算时,所有的数值最终都会转换为十进制数值。浮点数值必须包含一个小数点,如:
- var floatNum1 = 1.1;
- var floatNum2 = .1; //有效,但不推荐
- var floatNum3 = 1.; //小数点后面没有数字,解析为1
- var floatNum4 = 10.0; //整数,解析为10
浮点数值的最高精度是 17 位小数,但在进行算数计算时精确度远不如整数,例如:
- var a = 0.1;
- var b = 0.2;
- var c = a + b; //c的值为0.30000000000000004
NaN, 即非数值,是一个特殊的 Number 值,NaN 有两个特点:任何和 NaN 操作的结果都会返回 NaN,NaN 与任何值都不相等,包括 NaN。使用 isNaN() 函数可以判断一个值是不是 NaN,isNaN() 在接收到一个参数时,会尝试将这个值转换为数值,任何不能转换为数值的值都会返回 true,如:
- alert(isNaN(NaN)); //true
- alert(isNaN(10)); //false(10是一个数值)
- alert(isNaN("10")); //false(可以被转换为数值10)
- alert(isNaN("abc")); //true(不能转换为数值)
- alert(isNaN(true)); //false(可以转换为数值1)
- var obj = {
- name: "zhangsan",
- age: "1"
- };
- alert(isNaN(obj)); //true
isNaN() 也能转换对象,对象调用 isNaN() 时,会首先调用对象的 valueOf() 方法,然后确定该方法的返回值是否可以转换为数值,如果不能,则用这个返回值再调用 toString() 方法,再测试返回值。
非数值转换成数值的方法有三个:Number()、parseInt()、parseFloat()。Number() 可以转换任何数据类型的值,而 parseInt() 和 parseFloat() 只能转换字符串。
Number() 函数有以下转换规则:
1. 如果是 Boolean 值,true 转换为 1,false 转换为 0;
- var num = Number(true); //1
- var num2 = Number(false); //0
2. 如果是 Number 值,就和传入的值一样;
- var num = Number(1); //1
3. 如果是 null,转换为 0;
- var num = Number(null); //0
4. 如果是 undefined,转换为 NaN;
- var num = Number(undefined); //NaN
5. 如果是 String 值,要分多种情况,如果是空字符串,则转换为 0;如果是纯数字的字符串,则将其转换为相对应的数值,如果字符串是数字且包含 ".",则将其转换为对应的浮点数值 (如果字符串最前面是 0,会被忽略),如果字符串是有效的十六进制格式,会将其转换为对应的十进制数值;如果字符串包含上述格式之外的字符,则转换为 NaN;如果字符串是对象,会首先调用对象的 valueOf() 方法,然后确定该方法的返回值是否可以转换为数值,如果结果是 NaN,则调用 toString()方法,再测试返回值。
- var num = Number("Hello World"); //NaN
- var num2 = Number(""); //0
- var num3 = Number("01"); //1
- var num4 = Number("01.1"); //1.1
- var obj = {
- name: "zhangsan",
- age: "1"
- };
- alert(Number(obj)); //NaN
由于 Number() 在转换字符串是比较复杂,所以转换字符串常用 parseInt() 和 parseFloat()。这两个函数在转换字符串时,会检测该字符串是否符合数值模式,从第一个非空格字符开始解析,如果第一个字符不是数值或者负号,则返回 NaN(包括空字符串)。如果第一个字符是字符串,则继续解析后面的字符,直到解析完所有的字符或者遇到非数字字符。
parseInt() 能够识别各种整数格式 (十进制、八进制、十六进制),如果字符串以 "0x" 开头且后跟数字字符,就会被解析为十六进制,如果以 "0" 开头且后跟数字字符,则会被解析为八进制 (ECMAScript5 不识别八进制,会将前面的 0 忽略,解析为十进制)。
- var num = parseInt("123Hello"); //123
- var num2 = parseInt(""); //NaN
- var num3 = parseInt("0xA"); //10(十六进制)
- var num4 = parseInt("22.3"); //22
- var num5 = parseInt("070"); //56(ECMAScript3八进制) 70(ECMAScript5十进制)
- var num6 = parseInt("23"); //23(十进制)
为了解决兼容性问题,parseInt() 提供第二个参数,以何种数值格式解析。
- var num1 = parseInt("0xAF", 16); //175
- var num2 = parseInt("AF", 16); //175,可以省略前面的"0x"
- var num3 = parseInt("10", 2); //2(二进制)
- var num3 = parseInt("10", 8); //8(八进制)
- var num3 = parseInt("10", 10); //10(十进制)
- var num3 = parseInt("10", 16); //16(十六进制)
parseFloat() 只识别第一个小数点,后面的小数点就无效了,同时 parseFloat() 只识别是十进制值,所以没有第二个参数, 别的格式数值会被解析为 0。
- var num = parseFloat("123Hello"); //123
- var num = parseFloat("0xA"); //0
- var num = parseFloat("12.1"); //12.1
- var num = parseFloat("12.1.1"); //12.1
- var num = parseFloat("023"); //23
- var num = parseFloat("1.1e3"); //1100
String 类型值由若干个 Unicode 字符组成的字符序列构成,可以由单引号 ('') 或者双引号 ("") 表示,但是左右引号必须匹配。
- var str1 = "abc";
- var str2 = 'abc';
- var str3 = "abc'; //语法错误
将一个值显式转换为字符串有两种方法,toString() 和 String(),数值、布尔值、对象和字符串都有 toString() 方法和 String() 方法,而 undefined 和 null 只有 String() 方法,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"
- alert(true.toString()); //"true"
- String(num); //"10"
- String(true); //"true"
- String(null); //"null"
- var num1;
- String(num1); //"undefined"
来源: http://www.cnblogs.com/huiTime/p/6545606.html