跳到主要内容

四种判断相等性的方法

在 JavaScript 中,判断两个值是否相等有四种主要的方法。

全等 ===

全等运算符(===)用于判断两个值是否严格相等。它不会进行类型转换,只有当值的类型和值都相同时,才会返回 true

const a = 5;
const b = '5';
console.log(a === b); // false

等于 ==

等于运算符(==)在比较前会进行类型转换。如果两个值在转换后相等,则返回 true

const a = 5;
const b = '5';
console.log(a == b); // true

零值相等 +0 === -0

在比较正零和负零时,+0-0 会被认为是相等的。

console.log(+0 === -0); // true

同值相等 Object.is(+0, -0)Object.is(NaN, NaN)

同值相等使用 Object.is() 方法进行比较。它认为 +0-0 是不同的,且 NaN 等于自身。

console.log(Object.is(+0, -0)); // false
console.log(Object.is(NaN, NaN)); // true

JS 相等判断操作

在 JavaScript 中,判断相等性的操作主要有以下几种:

严格相等

严格相等(===)的特点包括:

  • 不进行隐式类型转换。
  • 原始值比较时,类型和值都必须相同。
  • 引用值比较时,必须指向同一内存地址。
  • NaN 与任何值都不相等。
  • +0 === -0 返回 true
// 严格相等 === Strict equality
const a = 10;
const b = 10;
console.log(a === b); // true

const obj1 = { key: 'value' };
const obj2 = { key: 'value' };
console.log(obj1 === obj2); // false

非严格相等

非严格相等(==)的特点包括:

  • 比较前可能进行隐式类型转换。
  • 转换后,使用严格相等判断。
  • nullundefined 只相等于彼此。
  • 窄对象(Narrow Object):在 IEDOM 中出现的一些对象,类似于 document.all
// 非严格相等 == Loose Equality
const a = '5';
const b = 5;
console.log(a == b); // true

console.log(null == undefined); // true
console.log(null === undefined); // false

JavaScript 中的相等性判断 - JavaScript | MDN

同值相等

同值相等使用 Object.is() 方法,它的比较规则如下:

  • +0 !== -0
  • NaN === NaN
const obj = {};

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

Object.defineProperty(obj, 'myZero', {
value: -0,
});

console.log(Object.is(obj.myZero, -0)); // true
console.log(Object.is(obj.myZero, +0)); // false

在同值相等的情况下,NaN === NaN

const objNaN = {};

Object.defineProperty(objNaN, 'myValue', {
value: NaN,
writable: false,
configurable: false,
enumerable: false,
});

Object.defineProperty(objNaN, 'myValue', {
value: NaN,
});

console.log(Object.is(objNaN.myValue, NaN)); // true

ES6 Object.is

Object.is() 是 ES6 引入的新方法,用于判断两个值是否是同一个值。它不进行隐式类型转换,比较更为严格。

// Object.is(v1, v2) ES6 新的 API,用于判断两个参数是否是同一个值

参数是两个值,返回布尔

Object.is() 接受两个参数,返回一个布尔值,表示这两个参数是否相等。

console.log(Object.is(+0, -0)); // false
console.log(Object.is(NaN, NaN)); // true
console.log(Object.is('hello', 'hello')); // true
console.log(Object.is({}, {})); // false

实现 Object.is()

以下是 Object.is() 的实现示例,通过自定义方法 Object.myIs 来模仿其行为:

Object.myIs = function (a, b) {
if (a === b) {
// 处理 +0 和 -0
return a !== 0 || 1 / a === 1 / b;
}
// 处理 NaN
return a !== a && b !== b;
};

console.log(Object.myIs(NaN, NaN)); // true
console.log(Object.myIs(+0, -0)); // false
console.log(Object.myIs(5, 5)); // true
console.log(Object.myIs('test', 'test')); // true
console.log(Object.myIs({}, {})); // false

这种实现方式确保了 Object.myIs 在比较时能正确处理 NaN+0-0 的特殊情况。