Skip to content

MDN 文档

等于 ==

不推荐使用 非严格/非约束/抽象相等 Loose Equeality/Abstract Equeality 比较之前肯定要先隐式转换, 转换之后还是用 === 来判断, 也就是说 ===  性能比 == 性能更好, 而且 === 语法更清晰明确

javascript
console.log(1 == '1'); // true

console.log(null == undefined); // true, what the fuck this?

全等(也叫严格相等) ===

严格相等 Strict Equality, 不仅值要相同, 数据类型也要相同

javascript
console.log(1 === '1'); // false
console.log(null === undefined); // false

同值相等 -0 !== +0 NaN===NaN

同值相等: same-value 底层实现原理就是用 Object.is 这个方法来做的, 但是 Object.is 是 es6 才有的方法, es5 并没有这个方法

javascript
var obj = {};

Object.defineProperty(obj, 'zero', {
  value: -0,
  writable: false,
  configurable: false,
});

// 报错: Uncaught TypeError: Cannot redefine property: zero
Object.defineProperty(obj, 'zero', {
  value: +0,
});

// 没有报错: 这就证明 -0 !== +0, +0就是0
Object.defineProperty(obj, 'zero', {
  value: -0,
});

// ======================= //

Object.defineProperty(obj, 'NotaNumber', {
  value: NaN,
  writable: false,
  configurable: false,
});

// 没有报错: 证明 NaN === NaN
Object.defineProperty(obj, 'NotaNumber', {
  value: NaN,
  writable: false,
  configurable: false,
});

零值相等 -0 === +0

零值相等: same-value-zero 零值相等和同值相等的区别就是: 零值相等模式下 -0 === +0

Object.is

用来比较是否同值相等 和全等 === 的判断区别就是 0 -0 NaN NaN 的判断

javascript
console.log(Object.is(0, -0)); // false: 进入if{}
console.log(Object.is(NaN, NaN)); // true: 进入else{}

Object.is 源码实现

javascript
Object.$is = function (x, y) {
  if (x === y) {
    // 判断 0 和 -0:
    // x === 0 才会执行||后面的代码:
    // 也就是 1/0 === 1/0 => Infinity === Infinity => true
    // 或者是 1/0 === 1/-0 => Infinity === -Infinity => false
    return x !== 0 || 1 / x === 1 / y;
  } else {
    // 处理 NaN 和 NaN
    return x !== x && y !== y;
  }
};

Released under the MIT License.