一般非基础类型进行转换时会先调用 valueOf,如果 valueOf 无法返回基本类型值,就会调用 toString
1. 字符串和数字
- "+"操作符,如果有一个为字符串,那么都转化到字符串然后执行字符串拼接。
- "-" 操作符,转换为数字,相减 (-a, a * 1 a/1) 都能进行隐式强制类型转换。
严格模式下===
,将转为数字后进行比较
2. 布尔值到数字
1 + true = 2;
1 + false = 1;
3. 转为布尔值
- for中第二个
- while
- if
- 三元表达式
- || 和 && 左边的操作数
严格模式下===
,将布尔类型转为数字后进行比较
假值列表:
- undefined
- null
- false
- +0,-0,NaN
- ""
Number类型转换
触发number 的隐式类型转换
- 比较操作(>, <, <=, >=)
- 按位操作(| & ^ ~)
- 算数操作(- + * / %), 注意,当 + 操作存在任意的操作数是 string - 类型时,不会触发 number 类型的隐式转换
- 一 元 + 操作
- 非严格相等操作(== 或者 != ),注意,== 操作两个操作数都是 string 类型时,不会发生 number 类型的隐式转换
例如:
+ '123' //123(number类型)
123 != "456" //true
4 > "5" //false
5 / null //Infinity
true | 0 //1
注意:undefined
转number为NaN
,NaN
与任何数据类型计算都为NaN
4. 符号(true)
- 不能被转为数字
- 能转成布尔值,全是true
5. 例题解析
1. true + false //1
2. 12 / "6" //2 除号运算符将6转成number
3. "number" + 15 + 3 //"number153",有string类型
4. 15 + 3 + "number" //"18number",从左到右执行,最后做字符串相加
5. [1] > null //true,'1'>0, 1>0,true
6. "foo" + + "bar" //"fooNaN", 一元 + 运算符比二元 + 运算符具有更高的优先级,"foo" + (+"bar"),"foo" + NaN,"fooNaN"
7. "true" == true //false, == 运算符执行 number 类型转换,'true' 转换为 NaN, boolean 类型 true 转换为 1
8. false == "false" //false, 0 == NaN, false
9. null == "" //false, null 不等于任何值除了 null 和 undefined
10. !!"false" == !!"true" //true, !! 运算符将字符串 'true' 和 'false' 转为 boolean 类型 true
11. ["x"] == "x" //true,
//== 运算符对数组类型执行 number 转换,先调用对象的 valueOf() 方法,
//结果是数组本身,不是原始类型值,所以执行对象的 toString() //方法,得到字符串 'x'
12. [] + null + 1 //null1, 先执行valueof,再执行toString
13. [1,2,3] == [1,2,3] //false
//当运算符两边类型相同时,不会执行类型转换,两个数组的内存地址不一样,所以返回 false
14. {} + [] + {} + [1]//'0[object Object]1'
//==> +[] + {} + [1]
//==> 0 + {} + [1]
//==> 0 + '[object Object]' + '1'
//==> '0[object Object]1'
15. ! + [] + [] + ![] //'truefalse'
//==> !(+[]) + [] + (![])
//==> !0 + [] + false
//==> true + [] + false
//==> true + '' + false
//==> 'truefalse'
16. new Date(0) - 0 //0
17. new Date(0) + 0 //'Thu Jan 01 1970 02:00:00 GMT+0200 (EET)0',
//'-' 运算符执行 number 类型隐式转换对于 Date 型的值,