Symbol.toPrimitive

701 阅读1分钟

symbol属性总结1

对象的Symbol.toPrimitive属性,指向一个方法。该对象被转为原始类型(number、string、Boolean、null、undefined、symbol、bigInt)的值时,会调用这个方法,返回该对象对应的原始类型值。
Symbol.toPrimitive被调用时,会接受一个字符串参数,表示当前运算的模式,一共有三种模式。

  • Number:该场合需要转成数值
  • String:该场合需要转成字符串
  • Default:该场合可以转成数值,也可以转成字符串

参数的三个值测试

let obj = {
  [Symbol.toPrimitive](hitn) {
    console.log(hitn)
  }
}
Number(obj)
String(obj)
Boolean(obj)//不生效
10 + obj
10 - obj//数据隐形转换

1638683549(1).png

Symbol.toPrimitive应用

   let time = new Date()
   >time
   >Sun Dec 05 2021 12:59:52 GMT+0800 (中国标准时间)
   >Number(time)
   >1638680392489
   Number(time) 浏览器转换->time[Symbol.toPrimitive]('number')没有toPrimitive属性会找valueof获取原始值
   1638680392489

可以结合js数据类型转换理解 symbol.promitive&Number.png 重构对象的Symbol.toPrimitive

let obj = {
  [Symbol.toPrimitive](hint) {
    switch (hint) {
      case 'number':
        return 123;
      case 'string':
        return 'str';
      case 'default':
        return 'default';
      default:
        throw new Error();
     }
   }
};

2 * obj // 246
3 + obj // '3default'
obj == 'default' // true
String(obj) // 'str'