NaN === NaN → false
Object.is(NaN, NaN) → true ✅
Object.is() là gì?Object.is() là 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 === 5Object.is("a", "a"); // true — giống "a" === "a"Object.is(null, null); // true — giống null === nullObject.is("5", 5); // false — giống "5" === 5Object.is(null, undefined); // false — giống null === undefined// === cho NaNNaN === NaN; // false ← sai về mặt logic!
// Object.is() cho NaNObject.is(NaN, NaN); // true ← đúng: NaN IS NaNĐây là lý do Object.is() hữu ích trong thuật toán cần xác định chính xác giá trị NaN.
// === cho ±0+0 === -0; // true ← che giấu sự khác biệt!
// Object.is() cho ±0Object.is(+0, -0); // false ← nhận ra +0 ≠ -0Object.is(+0, +0); // trueObject.is(-0, -0); // trueTrong toán học, +0 và -0 khác nhau (ví dụ: 1/+0 = Infinity, 1/-0 = -Infinity).
Object.is()?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ôngconst 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); // trueisNegativeZero(0); // falseisNegativeZero(-1); // false
// Ứng dụng: hướng di chuyển, đồ thị, physically-based renderingconsole.log(1 / +0); // Infinityconsole.log(1 / -0); // -InfinityObject.is()// 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