Object.is vs ===

2022-08-30 02:39:41

我偶然发现了一个使用这种比较的代码示例:

var someVar = 0;
Object.is(false, someVar); //Returns false 

我知道这将是这就是为什么我们有.false == 0true===

与 有何不同?Object.is===


答案 1

===在 JavaScript 中称为严格比较运算符。 和严格比较运算符的行为完全相同,但 和 除外。Object.isNaN+0/-0

来自 MDN:

Object.is()根据运算符,方法与相等不同。运算符(以及运算符)将数字值 -0 和 +0 视为相等,并将 值视为不等于 。========Number.NaNNaN

下面的代码突出显示了 和 之间的区别。===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

enter image description here

您可以在此处找到更多示例。

注意:是 ECMAScript 6 提案的一部分,尚未得到广泛支持(例如,任何版本的 Internet Explorer 或许多旧版本的其他浏览器都不支持它)。但是,您可以为非ES6浏览器使用polyfill,这可以在上面给出的链接中找到。Object.is


答案 2

Object.is使用规范的相同值算法,而使用严格相等算法。关于严格相等算法的注释指出了差异:===

此算法不同于同值算法...在处理有符号零和NaNs时。

请注意:

  • NaN === NaN是假的,但又是真的Object.is(NaN, NaN)
  • +0 === -0是真的,但又是假的Object.is(+0, -0)
  • -0 === +0是真的,但又是假的Object.is(-0, +0)

JavaScript至少有四种“平等”:

  • “松散”(),其中操作数将被强制尝试使它们匹配。规则是明确规定的,但不是显而易见的。( 是 ; 是 , ...)。=="" == 0true"true" == truefalse
  • “严格”(),其中不同类型的操作数不会被强制(并且不会相等),但请参阅上面的注释,以及正零和负零。===NaN
  • 相同值 - 如上所列(由 使用)。Object.is
  • SameValueZero - like except 和 is same 而不是 different (by for keys, and by )。SameValue+0-0MapArray.prototype.includes

还有对象等效性,它不是由语言或运行时本身提供的,但通常表示为:对象具有相同的原型,相同的属性,并且它们的属性值是相同的(通过“相同”的一些合理定义)。


同值算法

  • 如果 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 是相同的数字值,则返回 true。
    • 返回 false。
  • 返回 SameValueNonNumber(x, y)。

...其中 SameValueNonNumber 是:

  • 断言:Type(x) 不是 Number。
  • 断言:Type(x) 与 Type(y) 相同。
  • 如果 Type(x) 未定义,则返回 true。
  • 如果 Type(x) 为 Null,则返回 true。
  • 如果 Type(x) 是 String,则
    • 如果 x 和 y 是完全相同的代码单位序列(长度相同,相应索引处的代码单位相同),则返回 true;否则,返回 false。
  • 如果 Type(x) 是布尔值,则
    • 如果 x 和 y 都为真或均为假,则返回 true;否则,返回 false。
  • 如果 Type(x) 是 Symbol,则
    • 如果 x 和 y 都是相同的符号值,则返回 true;否则,返回 false。
  • 如果 x 和 y 是相同的对象值,则返回 true。否则,返回 false。

严格相等算法

  1. 如果 Type(x) 与 Type(y) 不同,则返回 false。
  2. 如果 Type(x) 是 Number,则
    • 如果 x 是 NaN,则返回 false。
    • 如果 y 是 NaN,则返回 false。
    • 如果 x 与 y 是相同的数字值,则返回 true。
    • 如果 x 为 +0 且 y 为 -0,则返回 true。
    • 如果 x 为 -0 且 y 为 +0,则返回 true。
    • 返回 false。
  3. 返回 SameValueNonNumber(x, y)。