此篇文章是參考MDN的JavaScript 中的相等性判斷
常見比較兩個值相等的方法有四種
-
非嚴格相等 ==
-
嚴格相等 === 常用於
a. Array.prototype.indexOf
b. Array.prototype.lastIndexOf
c. case-matching -
同值零:用於 %TypedArray% 和 ArrayBuffer 構造函數、以及Map和Set操作, 並將用於 ES2016/ES7 中的String.prototype.includes
-
同值: 用於所有其他地方
-
以及 Object.is (ECMAScript 2015/ ES6 新特性),幾乎和===一樣
各數據類型相互比較時的隱式轉換
- Undefined --- 無
- Null --- 無
- Number
- String -- ToNumber()
- Boolean -- ToNumber()
- Object -- ToPrimitive(),注意當Object和Undefined/Null比較時,Object的隱式轉換會調用IsFalsy()
類型轉換的方法詳解
ToNumber()
這是SpiderMonkey 17引入的功能,將任何JavaScript值轉換爲double。
ToPrimitive()
Symbol.toPrimitive 是一個內置的 Symbol 值,它是作爲對象的函數值屬性存在的,當一個對象轉換爲對應的原始值時,會調用此函數
每個對象在創建的時候對象內部都會有[Symbol.toPrimitive] (hint)這個方法,我們可以通過重寫對象內部的[Symbol.toPrimitive] (hint)即可修改這個方法,如:
// 一個沒有提供 Symbol.toPrimitive 屬性的對象,參與運算時的輸出結果
var obj1 = {};
console.log(+obj1); // NaN
console.log(`${obj1}`); // "[object Object]"
console.log(obj1 + ""); // "[object Object]"
// 接下面聲明一個對象,手動賦予了 Symbol.toPrimitive 屬性,再來查看輸出結果
var obj2 = {
[Symbol.toPrimitive](hint) {
if (hint == "number") {
return 10;
}
if (hint == "string") {
return "hello";
}
return true;
}};
console.log(+obj2); // 10 -- hint 參數值是 "number"
console.log(`${obj2}`); // "hello" -- hint 參數值是 "string"
console.log(obj2 + ""); // "true" -- hint 參數值是 "default"