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

Khác biệt instanceof vs Array.isArray() trong JavaScript

Cả hai kiểm tra mảng, nhưng Array.isArray() tin cậy hơn trong môi trường multi-frame/iframe.

Array.isArray() — Chuẩn ES5, Universal

  • Hoạt động đúng cross-realm (iframe, window khác).
  • Kiểm tra internal slot [[Array]] — không phụ thuộc prototype chain.

instanceof Array — Phụ thuộc prototype

  • Kiểm tra Array.prototype có trong prototype chain không.
  • Fail trong iframe: Mỗi frame có Array constructor riêng → iframeArray instanceof Array = false.

Ví dụ cùng realm — Cả hai đúng

<script>
  const a = [1,2,3];
  const b = {};
  document.write(Array.isArray(a) + '<br>'); // true
  document.write(a instanceof Array + '<br>'); // true
  document.write(Array.isArray(b) + '<br>'); // false
  document.write(b instanceof Array + '<br>'); // false
</script>

Ví dụ cross-realm (iframe) — instanceof FAIL

<script>
  const iframe = document.createElement('iframe');
  iframe.style.display = 'none';
  document.body.appendChild(iframe);

  const IFrameArray = iframe.contentWindow.Array;
  const arrFromIframe = new IFrameArray(1,2,3); // Array từ iframe khác

  document.write('Array.isArray(arrFromIframe): ' + Array.isArray(arrFromIframe) + '<br>'); // true
  document.write('arrFromIframe instanceof Array: ' + (arrFromIframe instanceof Array) + '<br>'); // FALSE!
</script>

Kết quả

Array.isArray(arrFromIframe): true
arrFromIframe instanceof Array: false

Bảng so sánh

Đặc điểmArray.isArray()instanceof Array
Cross-frame/realm✓ Đúng✗ Sai
Subclass của Array✓ True✓ True
Array-like object (arguments, NodeList)✗ False✗ False
PerformanceNhanhNhanh
Hỗ trợES5+ (IE9+)ES3+ (mọi nơi)

Kết luận

Luôn dùng Array.isArray() cho code production. instanceof chỉ dùng khi chắc chắn same realm hoặc cần kiểm tra subclass cụ thể.