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.prototypecó trong prototype chain không. - Fail trong iframe: Mỗi frame có
Arrayconstructor 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ểm | Array.isArray() | instanceof Array |
|---|---|---|
| Cross-frame/realm | ✓ Đúng | ✗ Sai |
| Subclass của Array | ✓ True | ✓ True |
| Array-like object (arguments, NodeList) | ✗ False | ✗ False |
| Performance | Nhanh | Nhanh |
| 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ể.