JavaScript 對象什麼場景下會轉換到基本類型值呢?javascript
obj1 + obj2
、obj1 - obj2
等。alert(obj)
。JavaScript 對象轉換到基本類型值時,會使用 ToPrimitive 算法,這是一個內部算法,是編程語言在內部執行時遵循的一套規則。java
ToPrimitive 算法在執行時,會被傳遞一個參數 hint
,表示這是一個什麼類型的運算(也能夠叫運算的指望值),根據這個 hint
參數,ToPrimitive 算法來決定內部的執行邏輯。算法
hint
參數的取值只能是下列 3 者之一:編程
string
number
default
當對象發生到基本類型值的轉換時,會按照下面的邏輯調用對象上的方法:編程語言
obj[Symbol.toPrimitive](hint)
;hint
取值是 "string"
:
obj.toString()
和 obj.valueOf()
。hint
取值是 "number"
或 "default" 的狀況
):
obj.valueOf()
和 obj.toString()
。咱們提到了 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
方法必須返回 hint
參數值所暗示的類型值。spa
但要注意下面兩點:code
Symbol.toPrimitive
和 toString
方法的返回值必須是基本類型值。valueOf
方法除了能夠返回基本類型值,也能夠返回其餘類型值。當咱們建立一個普通對象時({}
或 new Object()
的方式等),對象上是不具有 [Symbol.toPrimitive]
(方法)屬性的。因此,對於普通對象的到基本類型值的運算,通常按照具體場景:對象
hint
值爲 "string"
時,先調用 toString
,toString
若是返回一個基本類型值了,則返回、終止運算;不然接着調用 valueOf
方法。valueOf
,valueOf
若是返回一個基本類型值了,則返回、終止運算;不然接着調用 toString
方法。(完)ip