JavaScript具有四个不同的相等比较操作。
它返回true,如果两个操作数属于同一类型并具有相同的价值。
注意:对象的值是参考。
您可以通过Object.is(ECMAScript 6)使用此比较算法。
例子:
Object.is(1, 1); // 真正 Object.is(+0, -0); // 假 Object.is(NaN, NaN); // 真正 Object.is(true, "true"); // 假 Object.is(false, 0); // 假 Object.is(null, undefined); // 假 Object.is(1, "1"); // 假 Object.is([], []); // 假
该算法具有等价关系的属性:
自反性:is ,代表任何值Object.is(x, x)truex
对称性:是,且仅当是,对于任何值和。Object.is(x, y)trueObject.is(y, x)truexy
及物性:如果和是的话也是,对于任何值,和。Object.is(x, y)Object.is(y, z)trueObject.is(x, z)truexyz
它的行为类似于SameValue,但认为+0和-0相等。
您可以通过Array.prototype.includes(ECMAScript 7)使用此比较算法。
例子:
[1].includes(1); // 真正 [+0].includes(-0); // 真正 [NaN].includes(NaN); // 真正 [true].includes("true"); // 假 [false].includes(0); // 假 [1].includes("1"); // 假 [null].includes(undefined); // 假 [[]].includes([]); // 假
该算法仍然具有等价关系的属性:
自反性:is ,代表任何值[x].includes(x)truex
对称性:是,且仅当是,对于任何值和。[x].includes(y)true[y].includes(x)truexy
及物性:如果和是的话也是,对于任何值,和。[x].includes(y)[y].includes(z)true[x].includes(z)truexyz
它的行为类似于SameValue,但是
认为+0和-0相等。
认为NaN不同于任何值,包括自身
您可以通过===运算符(ECMAScript 3)使用此比较算法。
还有一个!==运算符(ECMAScript 3),它对的结果求反===。
例子:
1 === 1; // 真正 +0 === -0; // 真正 NaN === NaN; // 假 true === "true"; // 假 false === 0; // 假 1 === "1"; // 假 null === undefined; // 假 [] === []; // 假
该算法具有以下特性:
对称性:x === y是true,当且仅当,Y === Xis真正的, for any valuesX andy`。
及物性:如果x === y和y === z是true的话x === z也是true,对于任何值x,y和z。
但是不是等价关系,因为
NaN 不是自反的: NaN !== NaN
如果两个操作数属于同一类型,则其行为类似于严格相等比较。
否则,将强制它们如下:
undefined并且null被认为是相等的
将数字与字符串进行比较时,字符串被强制为数字
将布尔值与其他值进行比较时,布尔值被强制为数字
在将对象与数字,字符串或符号进行比较时,该对象被强制为基元
如果存在强制,则将递归比较强制值。否则,算法返回false。
您可以通过==运算符(ECMAScript 1)使用此比较算法。
还有一个!=运算符(ECMAScript 1),它对的结果求反==。
例子:
1 == 1; // 真正 +0 == -0; // 真正 NaN == NaN; // 假 true == "true"; // 假 false == 0; // 真正 1 == "1"; // 真正 null == undefined; // 真正 [] == []; // 假
该算法具有以下属性:
对称性:x == y是true,且仅当y == x是true,对于任何值x和y。
但是不是等价关系,因为
NaN 不是自反的: NaN != NaN
可传递性不成立,例如0 == ''和0 == '0',但是'' != '0'