Trong nhiều đoạn code thông thường, value instanceof Array và Array.isArray(value) cho cùng kết quả. Điều đó dễ tạo cảm giác chúng tương đương. Một mảng được tạo ở ngữ cảnh JavaScript khác giúp thấy rõ câu hỏi mà mỗi phép kiểm tra đang trả lời.
Các snippet đã chạy bằng Node.js 24.18.1. Tài liệu MDN và Node vm hiện hành được đọc ngày 04/11/2026; bản tài liệu Node hiện hành không được dùng làm tuyên bố rằng máy thử đang chạy cùng phiên bản. Demo chỉ thực thi literal do bài viết cung cấp, không xây dịch vụ chạy code bên ngoài.
Tạo mảng ở một context khác
Lưu thành array_realm.cjs, chạy node array_realm.cjs:
const assert = require('node:assert/strict');
const vm = require('node:vm');
const local = [1, 2];
const foreign = vm.runInNewContext('[1, 2]');
assert.equal(local instanceof Array, true);
assert.equal(Array.isArray(local), true);
assert.equal(foreign instanceof Array, false);
assert.equal(Array.isArray(foreign), true);
assert.notEqual(Object.getPrototypeOf(foreign), Array.prototype);
console.log('cross-context array cases passed');
Tất cả assertion đã qua. Mảng foreign vẫn là mảng, nhưng prototype của nó không phải Array.prototype đang được dùng trong context ngoài. Câu hỏi về chuỗi prototype với constructor cụ thể khác câu hỏi giá trị có phải Array thật hay không.
Realm có thể hiểu đơn giản là một môi trường với các intrinsic như Array riêng. Ví dụ dùng Node vm để tạo tình huống nhỏ có thể chạy cục bộ; không khẳng định đã thử browser iframe, worker hoặc một bridge native nào.
Thử chiều ngược lại bằng object có prototype Array
Chạy snippet độc lập:
const assert = require('node:assert/strict');
const looksRelated = Object.create(Array.prototype);
assert.equal(looksRelated instanceof Array, true);
assert.equal(Array.isArray(looksRelated), false);
assert.equal(Array.isArray({0: 'a', length: 1}), false);
assert.equal(Array.isArray(null), false);
assert.equal(Array.isArray(new Uint8Array([1, 2])), false);
console.log('prototype and non-array cases passed');
Các case đã được kiểm tra. Một object có thuộc tính đánh số và length không tự trở thành Array. Typed array cũng là một kiểu dữ liệu khác; không nên dùng tên gọi chung “mảng” trong trao đổi để suy rằng mọi API kiểm tra đều trả cùng kết quả.
Object.create ở đây chỉ dùng để làm rõ giới hạn của kiểm tra prototype. Nó không phải cách tạo mảng để thay Array literal trong code sản phẩm. Những hành vi khác của object ấy không được kiểm chứng như một Array đầy đủ.
Dùng trong validation thế nào?
Nếu hợp đồng yêu cầu một Array JavaScript, Array.isArray thể hiện ý định trực tiếp và không phụ thuộc Array constructor của cùng realm. Nhưng kết quả true chưa cho biết phần tử có đúng kiểu, có lỗ, có trùng ID hoặc thỏa giới hạn số lượng hay không.
Ví dụ danh sách mã sản phẩm cần bước kiểm tra từng mã và chính sách về rỗng riêng. Không biến một phép kiểm tra container thành bằng chứng dữ liệu đã đạt schema. Trong bài, các assertion chỉ xác nhận nhận diện Array và một số đối chứng không phải Array.
Một câu trả lời phỏng vấn có thứ tự
Bắt đầu từ ví dụ local cho cùng kết quả, rồi đưa ra foreign array để chỉ ra khác biệt. Sau đó giải thích prototype và dùng object đối chứng để tránh kết luận một chiều rằng instanceof chỉ có thể báo false nhầm.
Không cần gọi mọi tình huống khác nhau là một lỗ hổng. Đầu tiên xác định dữ liệu có đi qua realm khác hay không và code đang cần kiểm tra dạng container hay quan hệ prototype. Nếu cần xác nhận mảng, chọn đúng API rồi kiểm tra nội dung theo hợp đồng nghiệp vụ.
Giữ fixture nhỏ và assertion cụ thể giúp câu trả lời đi xa hơn việc nhớ tên một method. Kết quả ở đây được kiểm chứng trên Node đã nêu, còn tích hợp browser hoặc framework thật cần các kiểm tra tương ứng với môi trường đó.


