一、强制转换(显式转换)
强制转换主要指使用Number()、String()和Boolean()三个函数,手动将各种类型的值,分别转换成数字、字符串或者布尔值。
1. Number()
// 空字符串转为0
Number('') // 0
// 布尔值:true 转成 1,false 转成 0
Number(true) // 1
Number(false) // 0
// undefined:转成 NaN
Number(undefined) // NaN
// null:转成0
Number(null) // 0
-
比
parseInt函数严格。只要有一个字符无法转成数值,整个字符串就会被转为NaN:parseInt('42 cats') // 42
Number('42 cats') // NaN -
Number方法的参数是对象时,将返回NaN,除非是包含单个数值的数组:Number({a: 1}) // NaN Number([1, 2, 3]) // NaN Number([5]) // 5
-
除了
Number()之外,还可以通过parseInt()和parseFloat()来转换,不同的是parseInt()与parseFloat()只能在String类型上调用,而Number()不仅限于String类型
2. String()
String方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式:
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"
3. Boolean()
除了以下五个值的转换结果为false,其他的值全部为true。
-
undefined -
null -
0(包含-0和+0) -
NaN -
''(空字符串)
二、自动转换(隐式转换)
以强制转换为基础,预期什么类型的值,就调用该类型的转换函数。比如,某个位置预期为字符串,就调用String()函数进行转换。如果该位置既可以是字符串,也可能是数值,那么默认转为数值。
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
2. 加法的特殊性
因为JS里 +还可以用来拼接字符串,记住3点:
- 当一侧为
String类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。 - 当一侧为
Number类型,另一侧为原始类型,则将原始类型转换为Number类型。 - 当一侧为
Number类型,另一侧为引用类型,将引用类型和Number类型转换成字符串后拼接。
以上 3点,优先级从高到低,如:
123 + '123' // "123123" (规则1)
123 + null // 123 (规则2)
123 + {} // "1[object Object]" (规则3)
3. 一元运算符也会把运算子转成数值:
+'abc' // NaN
-'abc' // NaN
+true // 1
-false // 0
三、.使用 == 比较中的5条规则
1. NaN和其他任何类型(包括它自己)比较永远返回false
2. Boolean 和其他任何类型比较,Boolean 首先被转换为 Number 类型:
true == 1 // true
true == '2' // false, 先把 true 变成 1,而不是把 '2' 变成 true
3. String和Number比较,先将String转换为Number类型:
123 == '123' // true, '123' 会先变成 123
'' == 0 // true, '' 会首先变成 0
4. null == undefined比较结果是true,除此之外,null、undefined和其他任何结果的比较值都为false。
5. 原始类型和引用类型做比较时,引用类型会依照ToPrimitive规则转换为原始类型,如果还是没法得到一个原始类型,就会抛出 TypeError。
ToPrimitive规则,是引用类型向原始类型转变的规则,它遵循先valueOf后toString的模式期望得到一个原始类型。
'[object Object]' == {}
// true, 对象和字符串比较,对象通过 toString 得到一个基本类型值
'1,2,3' == [1, 2, 3]
// true, 同上 [1, 2, 3]通过 toString 得到一个基本类型值