🍎 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
2undefined
和null
: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
# String()
可以将任何类型的值转换为字符串。转换的规则为:
undefined
=>‘undefined’
- 布尔值
true
=>‘ture’
,false
=>‘false’
- 数值转换为对应的字符串;
- 对象 =>
[object Object]
,数组转换为以逗号分隔的字符串。
🌰 例子:
数值:
String(1) // '1'
1undefined
/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
- 对象:任意对象(包括
{}
) =>true
,null
=>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
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"
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
2
3
4
5
6
7
8
9
10
转换的规则与 Number()
相似, null
=> 0
, undefined
=> NaN