Object.is(val1, val2) (ES6) so sánh hai giá trị với ngữ nghĩa "same value" — chính xác hơn === ở 2 trường hợp đặc biệt.
Khi nào Object.is() khác === ?
| Trường hợp | === | Object.is() |
|---|---|---|
+0 === -0 | true | false (phân biệt dấu) |
NaN === NaN | false | true (NaN bằng NaN) |
Ngoài ra, Object.is() hoạt động giống === cho mọi giá trị khác.
Tiêu chí "same value" theo spec
- Cùng
undefinedhoặc cùngnull. - Cùng
truehoặc cùngfalse. - String: cùng độ dài, cùng ký tự, cùng thứ tự.
- Number: cùng giá trị số, cùng dấu (+0 ≠ -0), NaN = NaN.
- Object: cùng tham chiếu (reference equality).
Ví dụ
<script>
// String cùng giá trị
document.write(Object.is('tutorialspoint', 'tutorialspoint') + '<br>'); // true
// Polarity: +0 vs -0
document.write(Object.is(-0, +0) + '<br>'); // false
document.write((-0 === +0) + '<br>'); // true
// NaN
document.write(Object.is(NaN, NaN) + '<br>'); // true
document.write((NaN === NaN) + '<br>'); // false
// String khác nhau
document.write(Object.is('tutorialspoint!', 'tutorialspoint') + '<br>'); // false
// Object khác reference
document.write(Object.is({a:1}, {a:1}) + '<br>'); // false
</script>
Kết quả
true false true false false
Khi nào dùng Object.is()?
- Cần phân biệt
+0và-0(hiếm, nhưng quan trọng trong một số thuật toán toán học, WebGL). - Cần kiểm tra
NaNtrong mảng:arr.includes(NaN)không काम (vìNaN !== NaN), nhưngarr.some(x => Object.is(x, NaN))hoạt động. - Thư viện utility (Lodash
_.eq) dùngObject.isnội bộ.
Polyfill (ES5)
if (!Object.is) {
Object.is = function(x, y) {
if (x === y) return x !== 0 || 1/x === 1/y; // +0 vs -0
return x !== x && y !== y; // NaN check
};
}