2013-07-24 15 views
7

Việc thêm thuộc tính vào mảng có ký hiệu dấu chấm sẽ thay đổi giá trị đó thành đối tượng không?thay đổi mảng thành đối tượng (chữ hoa) bằng cách thêm giá trị sử dụng dấu chấm

var arr = []; 

arr.something = "test"; 

có phải là mảng không?

Tôi không nghĩ như vậy, nhưng underscore.js nói nó là

console.log(_.isArray(arr)); //true 

http://jsfiddle.net/wZcyG/

+1

Đây là mã mà bạn đang làm việc với: http://underscorejs.org/docs/underscore.html#section-112 –

+1

Đ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. –

+0

@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

Trả lời

7

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.

+0

+1 Có vẻ như dự đoán của tôi là đúng :) –

+0

Nhưng nó mất phương pháp 'length'? Vì vậy, nó được thay đổi trên một số cấp độ cơ bản, không? – 1252748

+0

dán mã ở trên vào bảng điều khiển của bạn. FF nói rằng nó có cả chiều dài = 0 và .something = test – Robert