首先,Javascript中将类型分成两大类:
- 原始类型:共有5种原始类型,包括数字、字符串、布尔值、null和undefined
- 对象类型:除了原始类型之外,别的都是对象类型;包括数组和函数也是一种对象
任意类型转换的原则是:
- 当js期待一个布尔值时,js会将任意类型转换成布尔值;
- 当js期待一个字符串时,js会将任意类型转换成字符串;
- 当js期待一个数字时,js会将任意类型转换成数字;
- 当js期待一个对象时,js会尝试将任意原始类型转换成对象——什么时候js会期待一个对象呢?一般是指调用属性/方法的时候:例如 any.property,any.method()
任意的类型转换遵循下表:
类型值转换为
字符串数字布尔值对象
空undefined"undefined"NaNfalsethrows TypeError
null"null"0falsethrows TypeError
布尔值true"true"1 new Boolean(true)
false"false"0 new Boolean(false)
字符串""(空字符串) 0falsenew String("")
"0"(0字符串) 0truenew String("0")
"1.2"(数字字符串) 1.2truenew String("1.2")
"one"(非空、非数字) NaNtruenew String("one")
数字0"0" falsenew Number(0)
-0"0" falsenew Number(-0)
NaN"NaN" falsenew Number(NaN)
Infinity"Infinity" truenew Number(Infinity)
-Infinity"-Infinity" truenew Number(-Infinity)
1 (非0数字)"1" truenew Number(1)
对象{} (任意对象)遵循转换规则遵循转换规则true
[] (空数组)""0true
[9] (1个数字元素)"9"9true
[9,1,'a'] (其他数组)"9,1,a"NaNtrue
function(){} (任意函数)遵循转换规则遵循转换规则true
几个注意点:
- 数字字符串可以直接转换成数字,而且允许前后有空白字符(包括空格、\t、\n等)
- null和undefined转换成对象时,会抛出 TypeError 异常:例如 null.toString() 就会出错
- 转换和==是不一样的: 一个值能转换成另一个值,但不代表两个值==:
例如 undefined可以转换成false,但undefined!=false;再有就是 [] 可转换成 true,但 [] == false
几个小技巧:
- 一元操作符 "+" 可以将操作数转换成数字:
+x 等级于 Number(x),也可以写出 x-0
那么我们将日期类型转换成毫秒的时候,可以这么写: var ms = +new Date - 一元操作符 "!" 会将操作数转换成布尔值并取反:
!1 === false
!!1 === true - 使用全局函数parseInt和parseFloat能更灵活地将字符串转换成数字,具体请自行学习:例如 parseInt("3 mouses") === 3
对象转换成原始类型的规则
首先,我们需要知道:所有的对象都继承/拥有两个方法,toString()和valueOf()。对象基类Object的toString()会返回一个字符串 "[object Object]",而默认的valueOf()方法则只会简单的返回对象自身。
- 对象转换成布尔值:
非常简单,所有对象都转换成true;即使是new Boolean(false),它一样会转换成false - 对象转换成字符串:
流程图如下: - 对象转换成数字:
流程图:
对于 "+" "==" "!=" 和 关系运算符(主要包括大于号小于号)
在表达式中,如果碰到了以上运算符,并且至少有一个操作数是对象的话,会有它们独特的规则,具体可参考犀牛书第四章。