JavaScript 对象转换到基本类型值算法 ToPrimitive

JavaScript 对象什么场景下会转换到基本类型值呢?javascript

  1. 数学运算:obj1 + obj2obj1 - obj2 等。
  2. 指望值是基本类型值的运算:alert(obj)

ToPrimitive 算法

JavaScript 对象转换到基本类型值时,会使用 ToPrimitive 算法,这是一个内部算法,是编程语言在内部执行时遵循的一套规则。java

hint

ToPrimitive 算法在执行时,会被传递一个参数 hint,表示这是一个什么类型的运算(也能够叫运算的指望值),根据这个 hint 参数,ToPrimitive 算法来决定内部的执行逻辑。算法

hint 参数的取值只能是下列 3 者之一:编程

  • string
  • number
  • default

转换算法

当对象发生到基本类型值的转换时,会按照下面的逻辑调用对象上的方法:编程语言

  1. 若是存在,调用 obj[Symbol.toPrimitive](hint)
  2. 不然,若是 hint 取值是 "string"
    • 不管是否存在,调用 obj.toString()obj.valueOf()
  3. 不然(也就是 hint 取值是 "number""default" 的状况):
    • 不管是否存在,调用 obj.valueOf()obj.toString()

肯定 hint

咱们提到了 ToPrimitive 算法中用到的 hint 参数,那怎样肯定一次运算场景下的 hint 取值是什么呢?很简单----新建一个对象,打印各个运算场景下的 hint 值:ui

let user = {
  name: "John",
  money: 1000,

  [Symbol.toPrimitive](hint) {
    console.log(`hint: ${hint}`);
  }
};

alert(user) // hint: string 
+user // hint: number
user + 500 // hint: default
复制代码

Symbol.toPrimitive 和 toString/valueOf 方法

并不要求 Symbol.toPrimitivetoString/valueOf 方法必须返回 hint 参数值所暗示的类型值。spa

但要注意下面两点:code

  1. Symbol.toPrimitivetoString 方法的返回值必须是基本类型值。
  2. valueOf 方法除了能够返回基本类型值,也能够返回其余类型值。

其余

当咱们建立一个普通对象时({}new Object() 的方式等),对象上是不具有 [Symbol.toPrimitive] (方法)属性的。因此,对于普通对象的到基本类型值的运算,通常按照具体场景:对象

  1. hint 值为 "string" 时,先调用 toStringtoString 若是返回一个基本类型值了,则返回、终止运算;不然接着调用 valueOf 方法。
  2. 不然,先调用 valueOfvalueOf 若是返回一个基本类型值了,则返回、终止运算;不然接着调用 toString 方法。

(完)ip

相关文章
相关标签/搜索