目录

🍎 JavaScript 数据类型转换机制

声明变量时只有一种数据类型,只有在运行期间才会确定当前变量的类型。

🌰 例子: let x = y ? 1 : a

x 在编译阶段无法获取,只有程序运行才能知道。

虽然变量的数据类型是不确定的,但是各种运算符对数据类型是有要求的,如果运算子的类型与预期不符合,就会触发类型转换机制。

常见的类型转换机制有:

  • 显式转换:强制转换;
  • 隐式转换:自动转换;

# 显式转换

可以清楚看到发生了类型的转变,常见的方法有:

  • Number()
  • parseInt()
  • String()
  • Boolean

# Number()

可以将任何类型的值转换为 数值类型。转换的规则为:

  • undefined => NaN
  • null => 0
  • true => 1
  • false => 0
  • String 类型会根据语法和转换规则转换
  • Symbol 抛出 TypeError 的异常
  • Object 先调用 toPrimitive 再调用 toNumber

🌰 例子:

  • 字符串的两种情况:

    Number('123') // 123
    Number('324abc') // NaN
    
    1
    2

    只有可以解析为数字的情况下才可以转换为相应的数值。 Number 转换比较严格, 只要有一个字符无法转换成字符,整个字符串都会被转换成 NaN

  • 布尔类型情况:

    Number(true) // 1
    Number(false) // 0
    
    1
    2
  • undefinednull

    Number(undefined) // NaN
    Number(null) // 0
    
    1
    2
  • 对象:

    Number({name: 'simon'}) // NaN
    Number([1, 2, 3])
    Number([5]) // 5
    
    1
    2
    3

    对于多个数值的对象或者数值,通常转换为 NaN ,只有一个数值的对数值,则准换位单独的那个值。

# parseInt()

相比于 Number 没有那么严格。 parseInt 逐个解析字符,不能转换的字符就会停下来。

🌰 例子:

parseInt('32a3') // 32
1

# String()

可以将任何类型的值转换为字符串。转换的规则为:

  • undefined => ‘undefined’
  • 布尔值 true => ‘ture’false => ‘false’
  • 数值转换为对应的字符串;
  • 对象 => [object Object] ,数组转换为以逗号分隔的字符串。

🌰 例子:

  • 数值:

    String(1) // '1'
    
    1
  • undefined / null

    String(undefined) // 'undefined'
    String(null) // 'null'
    
    1
    2
  • 对象:

    String({a: 1}) // [object Object]
    
    1
  • 数组:

    String([1, 2, 3]) // "1,2,3"
    
    1

# Boolean

可以将任意类型的值转换为布尔值,转换的规则为:

  • 字符串:非空字符串 => true ,空字符串 => false
  • 数值:非零数值(包括无穷值∞)=> true ,0 / NaN => false
  • 对象:任意对象(包括 {} ) => truenull => false
  • 数组:任意数组(包括 [] ) => true
  • undefined => false

🌰 例子:

Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false
Boolean({}) // true
Boolean([]) // true
Boolean(new Boolean(false)) // true
1
2
3
4
5
6
7
8

# 隐式转换

隐式转换可能发生的场景:

  • 比较运算时( === / !== / > / < )、 if / while 需要布尔值时;
  • 算术运算时( + / - / * / / / % );

除了上面的场景,还包括运算符两边的操作数不是同一类型。

# 自动转换为布尔值

在需要布尔值的地方,就会将非布尔值的参数自动转换为布尔值,系统内部回调用 Boolean ,规则同上面一样。

# 自动转换为字符串

遇到预期为字符串的地方,就会将非字符串的值转换为字符串。规则为:先将复合类型的值转换为原始类型的值,再将原始类型的值转换为字符串。

字符串的拼接操作常发生在 + 运算中:

'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"
1
2
3
4
5
6
7
8

# 自动转换为数值

除了 + 有可能加那个运算子转换为字符串,其他的运算符都会把运算子自动转换为数值。

'5' - '2' // 3
'5' * '2' // 10
true - 1  // 0
false - 1 // -1
'1' - 1   // 0
'5' * []    // 0
false / '5' // 0
'abc' - 1   // NaN
null + 1 // 1
undefined + 1 // NaN
1
2
3
4
5
6
7
8
9
10

转换的规则与 Number() 相似, null => 0undefined => NaN

📢 上次更新: 2022/09/02, 10:18:16