JavaScript 类型转换

308 阅读3分钟

隐式转换 / 自动转换

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


作者:Joel_W
链接:juejin.cn/post/696198… 来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

显式转换

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

if条件会用到

  • undefined
  • null
  • 0(包含-0+0
  • NaN
  • ''(空字符串)

使用 == 比较中的5条规则

1. NaN和其他任何类型(包括它自己)比较永远返回false

2. Boolean 和其他任何类型比较,Boolean 首先被转换为 Number 类型:

true == 1  // true 
true == '2'  // false, 先把 true 变成 1,而不是把 '2' 变成 true
复制代码

3. StringNumber比较,先将String转换为Number类型:

123 == '123' // true, '123' 会先变成 123
'' == 0 // true, '' 会首先变成 0
复制代码

4. null == undefined比较结果是true,除此之外,nullundefined和其他任何结果的比较值都为false

5. 原始类型引用类型做比较时,引用类型会依照ToPrimitive规则转换为原始类型,如果还是没法得到一个原始类型,就会抛出 TypeError

ToPrimitive规则,是引用类型向原始类型转变的规则,它遵循先valueOftoString的模式期望得到一个原始类型。

'[object Object]' == {} 
// true, 对象和字符串比较,对象通过 toString 得到一个基本类型值
'1,2,3' == [1, 2, 3] 
// true, 同上  [1, 2, 3]通过 toString 得到一个基本类型值
复制代码

经典输出题

if([] == ![]){
    console.log(true);
}else{
    console.log(false);
}

结果是 true
  • ![] => false
  • Boolean 和其他任何类型比较,Boolean 首先被转换为 Number 类型; 所以变成了 [] == 0
  • 原始类型引用类型做比较时,引用类型会依照ToPrimitive规则转换为原始类型。 所以变成了 '' == 0
  • StringNumber比较,先将String转换为Number类型,所以变成了 0==0
  • 最终结果是true