相等比較操作
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
時,對於任何值x
和y
。 - 及物性 :如果
Object.is(x, y)
和Object.is(y, z)
是true
,則Object.is(x, z)
也是true
,對於任何值x
,y
和z
。
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
,對於任何值x
和y
。 - 及物性 :如果
[x].includes(y)
和[y].includes(z)
是true
,則[x].includes(z)
也是true
,任何值x
,y
和z
。
嚴格的相等比較
它的行為類似於 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 === y
是true
,當且僅當,y === xis
true, for any values
xand
y`。 - 及物性 :如果
x === y
和y === z
是true
,則x === z
也是true
,對於任何值x
,y
和z
。
但不是等價關係, 因為
NaN
不反身 :NaN !== NaN
抽象的相等比較
如果兩個運算元屬於同一型別,則其行為類似於嚴格等同比較。
否則,它會強制它們如下:
undefined
和null
被認為是相等的- 將數字與字串進行比較時,字串將被強制轉換為數字
- 將布林值與其他值進行比較時,布林值會被強制轉換為數字
- 將物件與數字,字串或符號進行比較時,會將物件強制轉換為基元
如果存在強制,則遞迴地比較強制值。否則演算法返回 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 == y
是true
,如果且僅當y == x
是true
時,對於任何值x
和y
。
但不是等價關係, 因為