Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Object.is() trong JavaScript: So sánh giá trị chính xác

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 === -0truefalse (phân biệt dấu)
NaN === NaNfalsetrue (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 undefined hoặc cùng null.
  • Cùng true hoặc cùng false.
  • 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 +0 và -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 NaN trong mảng: arr.includes(NaN) không काम (vì NaN !== NaN), nhưng arr.some(x => Object.is(x, NaN)) hoạt động.
  • Thư viện utility (Lodash _.eq) dùng Object.is nộ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
  };
}