数据之间的类型转换
1. 引用类型转换为原始类型的规则
graph TB
A1(获取数据 data 与转换提示 hint) --> A2(data 是否为原始类型)
A2 --YES--> A3(返回 data)
A2 --NO--> A4(是否指定 hint)
A4 --YES--> A5(hint 是否为 Number)
A4 --NO--> A6(data 是否为 Date 类型)
A6 --YES--> A7(hint = String)
A6 --NO--> A8(hint = Number)
A7 ---> A5
A8 ---> A9(能否调用 Symbol.toPrimitive 方法)
A9 --NO--> A5
A9 --YES--> A10(调用 Symbol.toPrimitive 方法<br>返回值是否为原始类型)
A10 --YES--> A12(返回原始类型)
A10 --NO--> A13(报错 TypeError)
A5 --YES--> A14(是否可以调用 valueOf 方法,<br>且对应返回值为原始类型)
A14 --YES--> A15(返回该原始值)
A14 --NO--> A16(是否可以调用 toString 方法,<br>且对应返回值为原始类型)
A16 --YES--> A17(返回该原始值)
A16 --NO--> A18(报错 TypeError)
A5 --NO--> A19(是否可以调用 toString 方法,<br>且对应返回值为原始类型)
A19 --YES--> A20(返回该原始值)
A19 --NO--> A21(是否可以调用 valueOf 方法,<br>且对应返回值为原始类型)
A21 --YES--> A22(返回该原始值)
A21 --NO--> A23(报错 TypeError)
2. 原始类型之间的相互转换规则(隐式转换)
2.1 转换为数字 ToNumber
Argument Type | Result |
---|---|
Undefined | 返回 NaN |
Null | 返回 0 |
String | 参考下面的规则 |
Boolean | 如果是 true 则返回 1 , 如果是 false 则返回 0 |
Number | 返回输入的参数 |
Reference | ToNumber(ToPrimitive(reference, "Number")) |
2.1.1 String
转换为 Number
的规则
- 忽略开头与结尾的空白字符: 如
\n
,\t
console.log(+"\n\t 123 \n\t") //=> 123
- 忽略无意义的前导零:
console.log(+"000000123") //=> 123
- 允许十六进制
0x
, 十进制, 八进制0o
, 二进制0b
的整数输入, 允许十进制小数的输入, 允许科学计数法输入console.log(+"0x11") //=> 17 console.log(+"11") //=> 11 console.log(+"0o11") //=> 9 console.log(+"0b11") //=> 3 console.log(+"1.1") //=> 1.1 console.log(+"0x1.1") //=> NaN console.log(+"0o1.1") //=> NaN console.log(+"0b1.1") //=> NaN console.log(+"1e7") //=> 10000000 console.log(+"1e30") //=> 1e30
- 在
[第一个可视字符, 最后一个可视字符]
之间, 如若发现不符合数字规则的字符, 则返回NaN
console.log(+" 1 2 ") //=> NaN console.log(+" 1x ") //=> NaN console.log(+"1..2") //=> NaN
2.2 转换为字符串 ToString
Argument Type | Result |
---|---|
Undefined | 返回 "undefined" |
Null | 返回 "null" |
String | 返回输入的参数 |
Boolean | 如果是 false , 则返回 "false" , 如果是 true , 则返回 "true" |
Number | 参考下面的规则 |
Reference | ToString(ToPrimitive(reference, "String")) |
2.2.1 Number
转换为 String
的规则
+0
,0
,-0
都会转换为"0"
+Infinity
,Infinity
会转换为"Infinity"
,-Infinity
转换为"-Infinity"
NaN
会转换为"NaN"
- 特别大和特别小的数都会转变为科学计数法形式
2.3 转换为布尔值 ToBoolean
Argument Type | Result |
---|---|
Undefined | 返回 false |
Null | 返回 false |
String | 如果是空字符串 "" 则返回 false , 否则返回 true |
Boolean | 返回输入的值 |
Number | 如果是 +0 , -0 , 0 , NaN 则返回 false , 否则返回 true |
Reference | 返回 true |
3. 数据类型之间的相互转换
3.1 ==
引起的数据转换
graph TB
A1(定义 leftVal 和 rightVal) --> A2(leftVal 和 rightVal <br>类型是否相同<br>Reference, Number, String ...)
A2 --YES--> A3(返回 leftVal 与 rightVal 的全等比较结果)
A2 --NO--> A4(如果 leftVal 和 rightVal 中<br>null 和 undefined 一起出现)
A4 --YES--> A5(返回 true)
A4 --NO--> A6(如果有 Boolean 类型<br>则将布尔值进行 ToNumber 转换)
A6 --> A7(如果两值分别为 Number 和 String 类型<br>则将字符串进行 ToNumber 转换)
A7 --> A8(如果有 Reference 类型, <br>则对引用类型值进行 ToPrimitive 转换)
A8 --> A2
3.2 >=
, <=
, <
, >
返回 ToNumber(leftValue)
与 ToNumber(rightValue)
比较的结果
3.3 二元运算符 +
- 将左右两边的值通过
ToPrimitive
进行转换为leftPrimitive
和rightPrimitive
- 如果
leftPrimitive
和rightPrimitive
中有一个为String
类型, 返回ToString(leftPrimitive) + ToString(rightPrimitive)
的结果 - 否则, 返回
ToNumber(leftPrimitive) + ToNumber(rightPrimitive)
3.4 二元运算符 -
- 返回
ToNumber(leftValue) - ToNumber(rightValue)
的结果
3.5 一元运算符 +
, -
- 返回
+/-ToNumber(value)