JavaScript 中的相等性判斷及類型轉換解釋

此篇文章是參考MDN的JavaScript 中的相等性判斷

 

常見比較兩個值相等的方法有四種

  1. 非嚴格相等 ==

  2. 嚴格相等 === 常用於
    a. Array.prototype.indexOf
    b. Array.prototype.lastIndexOf
    c. case-matching

  3. 同值零:用於 %TypedArray% 和 ArrayBuffer 構造函數、以及Map和Set操作, 並將用於 ES2016/ES7 中的String.prototype.includes

  4. 同值: 用於所有其他地方

  5. 以及 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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章