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"
      
  • 相关阅读:
    [LeetCode]1290. 二进制链表转整数
    [LeetCode]1295. 统计位数为偶数的数字
    map 用法 拿到map数组每一个数据
    父子组件相互传参
    父组件给子组件传参 el-dialog 试例
    如何用JS判断div中内容为空,当为空时隐藏div
    完整的Vue+element-ui table组件实现表格内容的编辑删除和新行添加小实例
    Git操作
    charles的使用
    移动端的一些问题
  • 原文地址:https://www.cnblogs.com/ssaylo/p/13094069.html
Copyright © 2011-2022 走看看