js类型间的隐式转换,==比较规则
1. 数学运算符的转换规则
1.1 减、乘、除
在对各种非Number类型运用数学运算符(- * /)时,会先将非Number类型转换为Number类型。
1 - true // 0, 首先把 true 转换为数字 1, 然后执行 1 - 1 1 - null // 1, 首先把 null 转换为数字 0, 然后执行 1 - 0 1 * undefined // NaN, undefined 转换为数字是 NaN 2 * ['5'] // 10, ['5']首先会变成 '5', 然后再变成数字 5
1.2 加法的特殊性,规则优先级从上到下
- 一侧为String类型,另一侧为原始类型,将原始类型转换为字符串类型
- 一侧为Number,另一侧为非String的原始类型,将原始类型转换为Number
- 一侧为Number,另一侧为引用类型,将两者转为字符串然后进行拼接
123 + '123' // 123123 (规则1) 123 + null // 123 (规则2) 123 + true // 124 (规则2) 123 + {} // 123[object Object] (规则3)
2. 逻辑判断中的类型转换
2.1 null,undefined,'',NaN,0,false转换为false,其余转换为true({}, [])
2.2 '=='比较的5条规则
2.2.1 NaN与任何值比较都为false
NaN == NaN // false
2.2.2 Boolean与其他值比较时,Boolean首先转为Number
true == 1 // true true == '2' // false, 先把 true 变成 1,而不是把 '2' 变成 true true == ['1'] // true, 先把 true 变成 1, ['1']拆箱成 '1', 再参考规则3 true == ['2'] // false, 同上 undefined == false // false ,首先 false 变成 0,然后参考规则4 null == false // false,同上
2.2.3 String与Number比较,先将String转换为Number
123 == '123' // true, '123' 会先变成 123 '' == 0 // true, '' 会首先变成 0
2.2.4 nul==undefined为true,除此之外null、undefined与其他任何值比较均为false。
null == undefined // true null == '' // false null == 0 // false null == false // false undefined == '' // false undefined == 0 // false undefined == false // false
2.2.5 原始类型与引用类型作比较,引用类型依照ToPrimitive(先调用valueOf后调用toString)规则转为原始类型。
'[object Object]' == {} // true, 对象和字符串比较,对象通过 toString 得到一个基本类型值 '1,2,3' == [1, 2, 3] // true, 同上 [1, 2, 3]通过 toString 得到一个基本类型值