Nếu bạn nhìn vào underscore.js source, bạn sẽ thấy rằng các chức năng isArray
được định nghĩa là :
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) == '[object Array]';
};
Bản gốc của brower Array.isArray
nói rằng đó là một mảng vì đó là những gì nó đã được khởi tạo. Nếu trình duyệt không có số gốc isArray
, thì underscore.js sử dụng tùy chọn thứ hai: so sánh toString
trên đối tượng để xem đối tượng có khớp với chuỗi [object Array]
hay không.
Chỉ cần thêm thuộc tính là không đủ để thay đổi loại của đối tượng (theo máy ảo JavaScript, nó vẫn là đối tượng xảy ra là một mảng). JavaScript là một ngôn ngữ động có nghĩa là bạn có thể thêm các thuộc tính vào các đối tượng trong xây dựng, nhưng làm như vậy không thay đổi chúng là gì; bạn chỉ đơn giản là mở rộng chúng. Ví dụ, Prototype.js được sử dụng để mở rộng các đối tượng gốc bằng cách thêm các thuộc tính bổ sung cho chúng (như các trình vòng lặp, các bộ lọc, các hàm ánh xạ, vv).
Bạn có thể thấy những hành vi trong Chrome khá dễ dàng:
> var arr = [];
arr.something = "test";
> Array.isArray(arr);
true
> toString.call(arr);
"[object Array]"
EDIT
Mảng không mất length
tài sản của mình:
> var arr = [1, 2, 3];
arr.something = "test";
console.log(arr.length, arr.something);
3 "test"
ý rằng trình duyệt báo cáo độ dài chính xác của 3
và giá trị chính xác cho test
f hoặc thuộc tính something
.
Nguồn
2013-07-24 22:02:46
Đây là mã mà bạn đang làm việc với: http://underscorejs.org/docs/underscore.html#section-112 –
Đoán của tôi là khi bạn đánh giá dòng này 'arr = []' 'arr''s loại được đặt. Sau đó không có cơ hội để VM biết rằng kiểu đã thay đổi cho đến lần gán tiếp theo. –
@Adi Inbar Tiêu đề đó có mục đích. Tại sao bạn chỉnh sửa? Đó không phải là cách chính xác để xác định nó? – 1252748