强制类型转换规则
引用类型转换为基本类型
- 调用自身的
valueOf()方法,如果返回基本类型的值,则转换成功。 - 如果
valueOf()方法返回的还是引用类型值,则改为调用自身的toString()方法。如果toString()方法返回基本类型的值,则转换成功。 - 如果
toString()方法返回的是引用类型值,抛出错误。
需要注意的是,数组的默认 toString() 方法经过了重新定义,会将所有单元字符串化以后再用 "," 连接起来。
转换为字符串
null:"null"。undefined:"undefined"。- 布尔值:
"true"或"false"。 - 数值:通常直接转换为字符串即可,但是对于极小或极大的数值,会使用指数形式。
- 引用类型值:返回自身的
toString()方法的返回值。
1 | // "null" |
转换为数值
null:0。undefined:NaN。- 布尔值:
0或1。 - 字符串:十进制数值或
NaN。 - 引用类型值:先将引用类型值转换为基本类型值,然后再将该基本类型值转换为数值。
1 | // 0 |
转换为布尔值
在将值转换为布尔值时,除了下述 5 种情况,其他所有情况都会转换为 true:
nullundefinedfalse+0、-0或NaN""
显示强制类型转换
- 一元运算符
+、-、++和--都会调用Number()将其他类型转换为数值,或将日期对象转换为对应的毫秒数。注意不要混淆+、++、+ +,-、--、- -。 - 一元运算符
~会先将值强制类型转换为 32 位数值,然后执行按位非操作,可以将~x等价于-(x+1)。但是~-1的结果是0而不是-0,因为~是字位操作而非数学运算。 - 将值转换为布尔值时,可以使用
!运算符。
1 | var a = '1' |
隐式强制类型转换
+ 和 - 作为一元运算符和作为多元运算符时具有不同的含义,别混淆了!
+ 运算符
+ 运算符既能用于数值加法,也能用于字符串拼接。JavaScript 怎样来判断我们要执行的是哪个操作?
- 如果操作数中有字符串,进行字符串拼接操作。
- 如果操作数中有引用类型值,首先将引用类型值转换为基本类型值,然后进行后续操作。
- 其他情况全都进行数值加法。
- 运算符
与 + 运算符不同,- 运算符会只会执行减法运算。所以它会先将非数值类型的数据转换为数值,然后进行减法运算。
1 | var a = '12' |
宽松相等和严格相等
==允许在相等比较中进行强制类型转换,而===不允许。NaN不等于NaN。+0严格等于-0。!=与!==分别类似于==与===。
下面主要介绍 == 是如何进行强制类型转换的。
字符串和数值
首先将字符串转换为数值类型,然后进行比较。
1 | var a = 42 |
其他类型和布尔类型
首先将布尔类型的值转换为数值类型,然后进行比较。
1 | var a = '42' |
null 和 undefined
在 == 中 null 和 undefined 相等(它们也与其自身相等),除此之外其他情况都不相等。
1 | var a = null |
引用类型和基本类型
首先将引用类型转换为基本类型,然后进行比较。
1 | var a = 42 |
引用类型和引用类型
这种情况就是判断两个变量的引用是否相同