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"
    
原文地址:https://www.cnblogs.com/ssaylo/p/13094069.html