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

相關文章
相關標籤/搜索