Object.is()

Object.is() 方法确定两个值是否是 相同的值

语法

Object.is(value1, value2);

参数

value1
需要比较的第一个值。
value2
需要比较的第二个值。

返回值

一个 布尔值指示两个参数是否相同的

描述

Object.is() 会在下面这些情况下认为两个值是相同的:

  • 两个值都是 undefined
  • 两个值都是 null
  • 两个值都是 true 或者都是 false
  • 两个值是由相同个数的字符按照相同的顺序组成的字符串
  • 两个值指向同一个对象
  • 两个值都是数字并且
    • 都是正零 +0
    • 都是负零 -0
    • 都是 NaN
    • 都是除零和 NaN 外的其它同一个数字

这种相等性判断逻辑和传统的 == 运算符所用的不同,== 运算符会对它两边的操作数做隐式的类型转换(如果它们是不同类型的值的话),然后才进行相等性比较,(所以才会有类似 "" == falsetrue 的现象),但 Object.is 不会做这种类型转换。

当然,严格相等运算符 === 也不会对操作数进行类型转换,但是它会把 -0 +0 这两个数值视为相同的,还会把两个 NaN 看成是不相等的。

示例

Object.is('foo', 'foo');     // true
Object.is(window, window);   // true
Object.is('foo', 'bar');     // false
Object.is([], []);           // false
var test = { a: 1 };
Object.is(test, test);       // true
Object.is(null, null);       // true
// 特例
Object.is(0, -0);            // false
Object.is(-0, -0);           // true
Object.is(NaN, 0/0);         // true

Polyfill

Object.is() 是在 ES6/ECMAScript 2015 标准中加进来的;因此可能有些浏览器没有这个方法。您可以通过使用下面的代码解决这个问题。这能让你在没有该方法的地方使用 Object.is()。

if (!Object.is) {
  Object.is = function(x, y) {
    // SameValue algorithm
    if (x === y) { // Steps 1-5, 7-10
      // Steps 6.b-6.e: +0 != -0
      return x !== 0 || 1 / x === 1 / y;
    } else {
      // Step 6.a: NaN == NaN
      return x !== x && y !== y;
    }
  };
}

规范

规范名称 规范状态 备注
ECMAScript 2015 (6th Edition, ECMA-262)
Object.is
Standard 首次加入规范
ECMAScript Latest Draft (ECMA-262)
Object.is
Living Standard  

浏览器兼容性

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 30 22 (22) 未实现 (Yes) 未实现
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support 未实现 ? 22.0 (22) 未实现 未实现 未实现

相关链接

文档标签和贡献者