zoukankan      html  css  js  c++  java
  • 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"
      
  • 相关阅读:
    理解Cookie和Session的区别及使用
    数据库事务
    Mybatis和hibernate的优缺点比较
    MyBatis、JDBC相关知识
    JVM学习笔记(一,待整理)
    laravel运行url404错误
    电影TS、TC、SCR、R5、BD、HD等版本是什么意思
    mysql索引
    双系统更改启动顺序
    PHP Deprecated: Comments starting with '#' are deprecated in *.ini 警告解决办法
  • 原文地址:https://www.cnblogs.com/ssaylo/p/13094069.html
Copyright © 2011-2022 走看看