JavaScript相等比较操作
示例
JavaScript具有四个不同的相等比较操作。
相同值
它返回true,如果两个操作数属于同一类型并具有相同的价值。
注意:对象的值是参考。
您可以通过Object.is(ECMAScript6)使用此比较算法。
例子:
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(ECMAScript7)使用此比较算法。
例子:
[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不同于任何值,包括自身
您可以通过===运算符(ECMAScript3)使用此比较算法。
还有一个!==运算符(ECMAScript3),它对的结果求反===。
例子:
1 === 1; //真正 +0 === -0; //真正 NaN === NaN; //假 true === "true"; //假 false === 0; //假 1 === "1"; //假 null === undefined; //假 [] === []; //假
该算法具有以下特性:
对称性:x===y是true,当且仅当,Y===Xis真正的,foranyvaluesXandy`。
及物性:如果x===y和y===z是true的话x===z也是true,对于任何值x,y和z。
但是不是等价关系,因为
NaN不是自反的:NaN!==NaN
抽象平等比较
如果两个操作数属于同一类型,则其行为类似于严格相等比较。
否则,将强制它们如下:
undefined并且null被认为是相等的
将数字与字符串进行比较时,字符串被强制为数字
将布尔值与其他值进行比较时,布尔值被强制为数字
在将对象与数字,字符串或符号进行比较时,该对象被强制为基元
如果存在强制,则将递归比较强制值。否则,算法返回false。
您可以通过==运算符(ECMAScript1)使用此比较算法。
还有一个!=运算符(ECMAScript1),它对的结果求反==。
例子:
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'