数据之间的类型转换

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 的规则

  1. 忽略开头与结尾的空白字符: 如 \n, , \t
    console.log(+"\n\t 123 \n\t") //=> 123
    
  2. 忽略无意义的前导零:
    console.log(+"000000123") //=> 123
    
  3. 允许十六进制 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
    
  4. [第一个可视字符, 最后一个可视字符] 之间, 如若发现不符合数字规则的字符, 则返回 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 的规则

  1. +0 , 0 , -0 都会转换为 "0"
  2. +Infinity , Infinity 会转换为 "Infinity" , -Infinity 转换为 "-Infinity"
  3. NaN 会转换为 "NaN"
  4. 特别大和特别小的数都会转变为科学计数法形式

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 二元运算符 +

  1. 将左右两边的值通过 ToPrimitive 进行转换为 leftPrimitiverightPrimitive
  2. 如果 leftPrimitiverightPrimitive 中有一个为 String 类型, 返回 ToString(leftPrimitive) + ToString(rightPrimitive) 的结果
  3. 否则, 返回 ToNumber(leftPrimitive) + ToNumber(rightPrimitive)

3.4 二元运算符 -

  1. 返回 ToNumber(leftValue) - ToNumber(rightValue) 的结果

3.5 一元运算符 + , -

  1. 返回 +/-ToNumber(value)
posted @ 2023-03-29 12:56  小阁下  阅读(32)  评论(0编辑  收藏  举报