JavaScript相等比较操作

示例

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'