0%

JavaScript类型转换

转换成Number

type result
Undefined NaN
Null 0
Boolean 如果是true返回1,false返回0
Symbol 抛出TypeError

String转Number

只支持合法的字符串数字,数字和字母的组合就不行。如果数字前面有空格,或者空格,或者前后都有空格算是合法的。

1
2
3
4
Number('a') // NaN
Number('1a') // NaN
Number(' 1') // 1
Number(' 1 ') // 1

字符串到数字,也只支持十进制、二进制、八进制和十六进制。

1
2
3
Number('0b10') // 2
Number('0o10') // 8
Number('0x10') // 16

+Infinity和-Infinity也算合法Number型字符串。

1
2
Number('+Infinity') //Infinity
Number('-Infinity') //-Infinity

此外还支持科学计数法。用大写或者小写的e表示

1
2
Number('1e1') // 10
Number('1E1') // 10

转换String

type result
Undefined “undefined”
Null “null”
Boolean true转成”true”、false转成”false”
Symbol 抛出一个TypeError异常

Number转String

  1. NaN转为”NaN”
  2. +0或者-0转成”0”
  3. 比0小, 返回由”-“和 ToString(-Number)组成的字符串.
  4. 如果当Number绝对值较大或者较小的时候,字符串表示则是使用科学计数法表示的。

转成Boolean

type result
Undefined false
Null false
Number +0、-0、NaN返回false,其余的都返回true
String 空字符串返回false,其余的都返回true
Symbol true
BigInt 0n返回false,其余的都返回true
Object true

拆箱转换

对象到String和Number的转换都遵循”先拆箱再转换”的规则。通过拆箱转换,把对象变成基本类型,再从基本类型转换为对应的 String 或者 Number。
拆箱转换会尝试调用 valueOf 和 toString 来获得拆箱后的基本类型。如果 valueOf 和 toString 都不存在,或者没有返回基本类型,则会产生类型错误 TypeError。
到 String 的拆箱转换会优先调用 toString。其实String的toString和valueOf是一样的。

在 ES6 之后,还允许对象通过显式指定 @@toPrimitive Symbol 来覆盖原有的行为。

1
2
3
4
5
6
7
8
9
var o = {
valueOf : () => {console.log("valueOf"); return {}},
toString : () => {console.log("toString"); return {}}
}
o[Symbol.toPrimitive] = () => {console.log("toPrimitive"); return "hello"}

console.log(o + "")
// toPrimitive
// hello

装箱转换

每一种基本类型Number、String、Boolean、Symbol在对象中都有对应的类,所谓装箱转换,正是把基本类型转换为对应的对象,它是类型转换中一种相当重要的种类。

隐式装箱:

  1. 创建基本类型的一个实例;
  2. 在实例中调用制定的方法;
  3. 销毁这个实例。

在隐式装箱过程中会频繁创建临时对象。

显式装箱:

直接用new操作符进行创建实例。

强迫装箱:

Symbol和BigInt类型不能通过new来创建,这时可以定义一个函数,函数里面只有 return this,然后我们调用函数的 call 方法到一个 Symbol 类型的值上,这样就会产一个symbolObject。

1
2
3
4
5
6
var symbolObject = function() {
return this
}.call(Symbol("a"))
console.log(typeof symbolObject) //object
console.log(symbolObject instanceof Symbol) //true
console.log(symbolObject.constructor == Symbol) //true