Object.is与===
我偶然发现了一个使用这种比较的代码示例:
var someVar = 0; Object.is(false, someVar); //Returns false
我知道false == 0
将是true
,这就是为什么我们有===
。
Object.is
与===
什么不同?
===
在JavaScript中称为严格比较运算符。 Object.is
和严格比较运算符的行为完全相同,除了NaN
和+0/-0
。
来自MDN:
根据
===
运算符,Object.is()
方法不相同。===
运算符(以及==
运算符)也将数字值-0和+0视为相等,并将Number.NaN
视为不等于NaN
。
下面的代码突出了===
和Object.is()
之间的区别。
console.log(+0 === -0); //true console.log(Object.is(+0, -0)); //false console.log(NaN === NaN); // false console.log(Object.is(NaN, NaN)); //true console.log(Number.NaN === Number.NaN); // false console.log(Object.is(Number.NaN, Number.NaN)); // true console.log(NaN === Number.NaN); // false console.log(Object.is(NaN, Number.NaN)); // true
你可以在这里find更多的例子。
注意 : Object.is
是ECMAScript 6提议的一部分,但尚未得到广泛支持。 但是,您可以在上面给出的链接中find非ES6浏览器的polyfill。
Object.is
使用规范的SameValuealgorithm ,而===
使用严格相等algorithm 。 关于严格平等algorithm的一个说明提出了差异:
该algorithm与SameValuealgorithm…在处理有符号零和NaN方面有所不同。
注意:
-
NaN === NaN
是错误的,但是Object.is(NaN, NaN)
是真的 -
+0 === -0
为true,但Object.is(+0, -0)
为false -
-0 === +0
是正确的,但是Object.is(-0, +0)
是错误的
JavaScript 至less有四种“平等”:
- “松散”(
==
),操作数将被强制设法使它们匹配。 规则明确规定 ,但不明显。 ("" == 0
是true
;"true" == true
是false
,…)。 - “严格”(
===
),其中不同types的操作数不会被强制(而不会相等),但请参阅上面有关NaN
和正负的零的注释。 - SameValue – 如上所列(由
Object.is
)。 - SameValueZero – 和
SameValue
一样,除了+0
和-0
是相同的而不是不同的(由Map
和Array.prototype.includes
)。
还有对象等价性 ,这不是由语言或运行时本身提供的,而是通常表示为:对象具有相同的原型,相同的属性和属性值是相同的(通过一些合理的定义“相同” )。
SameValuealgorithm :
- 如果Type(x)与Type(y)不同,则返回false。
- 如果Type(x)是Number,那么
- 如果x是NaN,y是NaN,则返回true。
- 如果x是+0而y是-0,则返回false。
- 如果x是-0而y是+0,则返回false。
- 如果x与y的Number值相同,则返回true。
- 返回false。
- 返回SameValueNonNumber(x,y)。
…其中SameValueNonNumber是:
- 断言:types(x)不是数字。
- 断言:types(x)与types(y)相同。
- 如果Type(x)是Undefined,则返回true。
- 如果Type(x)是Null,则返回true。
- 如果types(x)是string,那么
- 如果x和y是完全相同的代码单元序列(在相应的索引处长度相同且代码单元相同),则返回true; 否则,返回false。
- 如果types(x)是布尔值,那么
- 如果x和y都是真或者都是假,则返回true; 否则,返回false。
- 如果types(x)是符号,那么
- 如果x和y都是相同的Symbol值,则返回true; 否则,返回false。
- 如果x和y是相同的Object值,则返回true。 否则,返回false。
严格的相等algorithm :
- 如果Type(x)与Type(y)不同,则返回false。
- 如果Type(x)是Number,那么
- 如果x是NaN,则返回false。
- 如果y是NaN,则返回false。
- 如果x与y的Number值相同,则返回true。
- 如果x是+0,y是-0,则返回true。
- 如果x是-0,y是+0,则返回true。
- 返回false。
- 返回SameValueNonNumber(x,y)。