JavaScript 类型转换 Type Convertion
参考 ECMA-262 section 7
Type Convertion
Number | String | Boolean | Undefined | Null | Object | Symbol | |
---|---|---|---|---|---|---|---|
Number | - | NumberTo String | 0=>false | × | × | Boxing | × |
String | StringTo Number | - | ""=>false | × | × | Boxing | × |
Boolean | true=>1 false=>0 | 'true' 、'false' | - | × | × | Boxing | × |
Undefined | NaN | 'undefined' | false | - | × | × | × |
Null | 0 | 'null' | false | × | - | × | × |
Object | valueOf | valueOf toString | true | × | × | - | × |
Symbol | × | × | × | × | × | Boxing | - |
-
Boxing & Unboxing
new Number(1) // Number {1} new String('hello') // String {"hello"} new String('hello').length // 5 'hello'.length // 5 !new String("") // false !"" // true // 强制类型转换 Number('1') // 1 String(1) // '1' Boolean(1) // true Object(1) // Number {1} Object("hello") Object(true) Object(Symbol('x')) // 除了不能 new,其它与构造器一样 Object(Symbol('x')) instanceof Symbol // true Object.getPrototypeOf(Object(Symbol('x'))) === Symbol.prototype // true (function(){return this}).apply(Symbol('x')) // boxing Symbol {Symbol(x)}
- ToPremitive
- toString vs valueOf
1 + {} // '1[object Object]' 1 + { valueOf(){ return 1 } } // 2 1 + { toString(){ return 1 } } // 2 1 + { toString(){ return '1' } } // '11' 1 + { valueOf() { return 1 }, toString() { return '2' } } // 2 '1' + { valueOf() { return 1 }, toString() { return '2' } } // '11' 1 + { [Symbol.toPrimitive](){ return 5 }, valueOf(){ return 1 }, toString(){ return '2' } } // 6 1 + { [Symbol.toPrimitive](){ return {} }, valueOf(){ return 1 }, toString(){ return '2' } } // TypeError:Cannot convert object to primitive value 1 + { valueOf() { return }, toString() { return '2' } } // '1undefined' 1 + { valueOf() { return {} }, toString() { return '2' } } // '12'
总结:
有
toPrimitive
只调toPrimitive
;没有
toPrimitive
会默认执行toPrimitive
代码,会先调valueOf
再调toString
// hint Number new Date().toJSON() "2020-04-25T03:16:26.552Z"