转换成Number
type | result |
---|---|
Undefined | NaN |
Null | 0 |
Boolean | 如果是true返回1,false返回0 |
Symbol | 抛出TypeError |
String转Number
只支持合法的字符串数字,数字和字母的组合就不行。如果数字前面有空格,或者空格,或者前后都有空格算是合法的。1
2
3
4Number('a') // NaN
Number('1a') // NaN
Number(' 1') // 1
Number(' 1 ') // 1
字符串到数字,也只支持十进制、二进制、八进制和十六进制。1
2
3Number('0b10') // 2
Number('0o10') // 8
Number('0x10') // 16
+Infinity和-Infinity也算合法Number型字符串。1
2Number('+Infinity') //Infinity
Number('-Infinity') //-Infinity
此外还支持科学计数法。用大写或者小写的e表示1
2Number('1e1') // 10
Number('1E1') // 10
转换String
type | result |
---|---|
Undefined | “undefined” |
Null | “null” |
Boolean | true转成”true”、false转成”false” |
Symbol | 抛出一个TypeError异常 |
Number转String
- NaN转为”NaN”
- +0或者-0转成”0”
- 比0小, 返回由”-“和 ToString(-Number)组成的字符串.
- 如果当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
9var 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在对象中都有对应的类,所谓装箱转换,正是把基本类型转换为对应的对象,它是类型转换中一种相当重要的种类。
隐式装箱:
- 创建基本类型的一个实例;
- 在实例中调用制定的方法;
- 销毁这个实例。
在隐式装箱过程中会频繁创建临时对象。
显式装箱:
直接用new操作符进行创建实例。
强迫装箱:
Symbol和BigInt类型不能通过new来创建,这时可以定义一个函数,函数里面只有 return this,然后我们调用函数的 call 方法到一个 Symbol 类型的值上,这样就会产一个symbolObject。1
2
3
4
5
6var symbolObject = function() {
return this
}.call(Symbol("a"))
console.log(typeof symbolObject) //object
console.log(symbolObject instanceof Symbol) //true
console.log(symbolObject.constructor == Symbol) //true