Blog
Blog copied to clipboard
变量和类型 - 隐式类型转换
隐式类型转换
-
- 在加法运算时
- 1-1 若两操作数中有字符串,则优先转字符串;
- 1-2 若两操作数都不是字符串,则优先转数字,若是引用类型转换得到字符串,则回到1-1。
-
- 其他运算及
==
,均优先转数字,若是转换得到字符串,再尝试转数字,转成则计算,转不成则NaN
;
- 其他运算及
-
-
null
转数字为0,undefined
转数字为NaN
;
-
-
- 引用类型转数字
valueOf
优先级大于toString
,转字符串toString
优先级大于valueOf
,先调用优先级高的,得不到基本类型再调用优先级低的。
- 引用类型转数字
-
-
+varible
强制转数字,失败则为NaN
;
-
-
- 多个加号从左到右依次计算。
// 满足1-1,左边的1转字符串'1',相加为'11'
1 + '1' // '11'
// 首先![]优先计算为false,本题实质是 [] == false
// 满足规则1-2,[]尝试转数字,用valueOf,还是[],不行
// 再用toString,得到空字符串,此时为 '' == false
// ''转数字为0,false转数字为0,所以此题为true
[] == ![] // true
// true + true 符合1-2,即1 + 1 = 2
// 2 + false 符合1-2, 即 2 + 0 = 2
// 2 + '100' 符合1-1,即 '2' + '100' = '2100'
true + true + false + '100' // '2100'
// 符合1-2,数组转数字,调用valueOf失败
// 调用toString得到 '1,2,3,4'
// 4 + '1,2,3,4' 符合1-1,最终为 '41,2,3,4'
4 + [1, 2, 3, 4]
// 符合1-2,对象转数字,调用valueOf失败
// 调用toString得到 '[object Object]'
// 1 + '[object Object]',符合1-1,最终结果为'1[object Object]'
1 + {}
// +'b'视为整体,强制转数字,失败,返回NaN
// 'a' + NaN,符合1-1,返回'aNaN'
'a' + + 'b'