1. 数学运算中的类型转换
1.1 减、乘、除
会将非Number类型转换成Number类型
1 - true // 0, 首先把 true 转换为数字 1, 然后执行 1 - 1
1 - null // 1, 首先把 null 转换为数字 0, 然后执行 1 - 0
1 - {} // NaN, {}转换为数字是 NaN
1 * undefined // NaN, undefined转换为数字是 NaN
2 * ['5'] // 10, ['5']首先会变成 '5', 然后再变成数字 5
1.2 加
当一侧为String类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。
当一侧为Number类型,另一侧为
- 原始类型,则将原始类型转换为
Number类型。 - 引用类型,将引用类型和
Number类型转换成字符串后拼接。
123 + '123' // 123123
123 + null // 123 首先把 null 转换为数字 0, 然后执行 123 + 0
123 + true // 124 首先把 true 转换为数字 1, 然后执行 123 + 1
123 + {} // 123[object Object] 123' + '[object Object]'
2. 逻辑语句中的类型转换
2.1 单个变量
如果只有单个变量,会先将变量转换为Boolean值。
下图是不同变量分别转换为Boolean、Number、String的值
2.2 使用 == 比较
NaN和其他任何类型比较永远返回false(包括和他自己)。Boolean和其他任何类型比较,Boolean首先被转换为Number类型。String和Number比较,先将String转换为Number类型。null == undefined比较结果是true,除此之外,null、undefined和其他任何结果的比较值都为false。原始类型和引用类型做比较时,引用类型会依照ToPrimitive规则转换为原始类型。
ToPrimitive规则,是引用类型向原始类型转变的规则,它遵循先valueOf后toString的模式期望得到一个原始类型。如果还是没法得到一个原始类型,就会抛出TypeError。
3. 综上所述 看一下这两个
3.1 [] == ![]
- 第一步,![] 会变成 false
- 第二步,题目变成: [] == 0
- 第三步,[]的valueOf是0,题目变成: 0 == 0
- 所以, 答案是 true !//
3.2 [undefined] == false
- 第一步,应用 规则5 ,[undefined]通过toString变成 '',
题目变成 '' == false
- 第二步,题目变成 '' == 0
- 第三步,题目变成 0 == 0
- 所以, 答案是 true !
// 但是 [undefined] 又是个true!