JavaScript 隐式类型转换

93 阅读2分钟

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的值

隐式转换.png

2.2 使用 == 比较

  1. NaN其他任何类型比较永远返回false(包括和他自己)。
  2. Boolean其他任何类型比较,Boolean 首先被转换为 Number 类型。
  3. StringNumber比较,先将String转换为Number类型。
  4. null == undefined比较结果是true,除此之外,nullundefined和其他任何结果的比较值都为false
  5. 原始类型引用类型做比较时,引用类型会依照ToPrimitive规则转换为原始类型。

ToPrimitive规则,是引用类型向原始类型转变的规则,它遵循先valueOftoString的模式期望得到一个原始类型。如果还是没法得到一个原始类型,就会抛出 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!