JS数据类型转换

732 阅读3分钟

一、强制转换(显式转换)

强制转换主要指使用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. 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 得到一个基本类型值

参考资料