Bỏ qua để đến nội dung

Same-value Equality — Object.is()

Object.is()phương thức tĩnh của Object, thực hiện so sánh giá trị chính xác nhất (same-value equality) trong JavaScript.

Object.is(value1, value2);

Giống === trong hầu hết trường hợp, nhưng khác ở hai điểm quan trọng:

NaN === NaN → false

Object.is(NaN, NaN)true

+0 === -0 → true

Object.is(+0, -0)false


Trong 99% trường hợp, Object.is() cho kết quả giống ===:

Object.is(5, 5); // true — giống 5 === 5
Object.is("a", "a"); // true — giống "a" === "a"
Object.is(null, null); // true — giống null === null
Object.is("5", 5); // false — giống "5" === 5
Object.is(null, undefined); // false — giống null === undefined

Kiểm tra NaN

Thay thế Number.isNaN() khi cần so sánh trực tiếp hai giá trị

Phân biệt ±0

Thuật toán toán học, polyfill, hoặc khi dấu của zero quan trọng

Polyfill & Library

Dùng trong nội bộ React (Object.is cho useState dependency check), SameValue trong spec


// React dùng Object.is() để check state có thay đổi không
const prevState = NaN;
const nextState = NaN;
// Nếu dùng ===:
prevState === nextState; // false → re-render (SAI — giá trị không đổi!)
// Dùng Object.is():
Object.is(prevState, nextState); // true → skip re-render (ĐÚNG)
function isNegativeZero(x) {
return Object.is(x, -0);
}
isNegativeZero(-0); // true
isNegativeZero(0); // false
isNegativeZero(-1); // false
// Ứng dụng: hướng di chuyển, đồ thị, physically-based rendering
console.log(1 / +0); // Infinity
console.log(1 / -0); // -Infinity
// Nếu cần hỗ trợ môi trường cũ (trước ES6)
if (!Object.is) {
Object.is = function(x, y) {
if (x === y) {
// Xử lý +0 vs -0
return x !== 0 || 1 / x === 1 / y;
}
// Xử lý NaN
return x !== x && y !== y;
};
}

Biểu thức=====Object.is()
5, 5
"5", 5
0, false
"", 0
null, undefined
null, null
NaN, NaN
+0, -0
{}, {}


Giống ===

Trong 99% trường hợp, Object.is() cho kết quả giống ===

NaN = NaN

Object.is(NaN, NaN)true — chính xác hơn ===

+0 ≠ -0

Object.is(+0, -0)false — phân biệt dấu zero

Dùng khi cần chính xác

Thuật toán, polyfill, React state comparison, spec-level code