相等比較操作

JavaScript 有四種不同的相等比較操作。

SameValue

如果兩個運算元屬於同一個 Type 並且值相同,則返回 true

注意:物件的值是引用。

你可以通過 Object.is(ECMAScript 6)使用此比較演算法。

例子:

Object.is(1, 1);            // true
Object.is(+0, -0);          // false
Object.is(NaN, NaN);        // true
Object.is(true, "true");    // false
Object.is(false, 0);        // false
Object.is(null, undefined); // false
Object.is(1, "1");          // false
Object.is([], []);          // false

該演算法具有等價關係的屬性 :

  • 反身性Object.is(x, x)true,任何值 x
  • 對稱性Object.is(x, y)true,如果且僅當 Object.is(y, x)true 時,對於任何值 xy
  • 及物性 :如果 Object.is(x, y)Object.is(y, z)true,則 Object.is(x, z) 也是 true,對於任何值 xyz

SameValueZero

它的行為類似於 SameValue,但認為+0-0 是相同的。

你可以通過 Array.prototype.includes(ECMAScript 7)使用此比較演算法。

例子:

[1].includes(1);            // true
[+0].includes(-0);          // true
[NaN].includes(NaN);        // true
[true].includes("true");    // false
[false].includes(0);        // false
[1].includes("1");          // false
[null].includes(undefined); // false
[[]].includes([]);          // false

該演算法仍具有等價關係的屬性 :

  • 反身性[x].includes(x)true,任何值 x
  • 對稱性[x].includes(y)true,如果且僅當 [y].includes(x)true,對於任何值 xy
  • 及物性 :如果 [x].includes(y)[y].includes(z)true,則 [x].includes(z) 也是 true,任何值 xyz

嚴格的相等比較

它的行為類似於 SameValue,但是

  • 認為+0-0 是相等的。
  • 認為 NaN 與任何價值都不同,包括其本身

你可以通過 === 運算子(ECMAScript 3)使用此比較演算法。

還有 !== 運算子(ECMAScript 3),它否定了 === 的結果。

例子:

1 === 1;            // true
+0 === -0;          // true
NaN === NaN;        // false
true === "true";    // false
false === 0;        // false
1 === "1";          // false
null === undefined; // false
[] === [];          // false

該演算法具有以下屬性:

  • 對稱x === ytrue,當且僅當,y === xistrue, for any valuesxandy`。
  • 及物性 :如果 x === yy === ztrue,則 x === z 也是 true,對於任何值 xyz

但不是等價關係, 因為

  • NaN反身NaN !== NaN

抽象的相等比較

如果兩個運算元屬於同一型別,則其行為類似於嚴格等同比較。

否則,它會強制它們如下:

  • undefinednull 被認為是相等的
  • 將數字與字串進行比較時,字串將被強制轉換為數字
  • 將布林值與其他值進行比較時,布林值會被強制轉換為數字
  • 將物件與數字,字串或符號進行比較時,會將物件強制轉換為基元

如果存在強制,則遞迴地比較強制值。否則演算法返回 false

你可以通過 == 運算子(ECMAScript 1)使用此比較演算法。

還有 != 運算子(ECMAScript 1),它否定了 == 的結果。

例子:

1 == 1;            // true
+0 == -0;          // true
NaN == NaN;        // false
true == "true";    // false
false == 0;        // true
1 == "1";          // true
null == undefined; // true
[] == [];          // false

該演算法具有以下屬性:

  • 對稱x == ytrue,如果且僅當 y == xtrue 時,對於任何值 xy

但不是等價關係, 因為

  • NaN反身NaN != NaN
  • 傳遞性不成立,例如 0 == ''0 == '0',但是'' != '0'