2010-07-30 186 views
5

Như tôi nghĩ, mảng JS chỉ là một bản đồ băm chỉ chấp nhận giá trị tích phân làm khóa. Và thuộc tính .length chỉ trả lại chỉ mục lớn nhất + 1.Sự khác nhau giữa JavaScript Array và Object ngoại trừ thuộc tính .length là gì?

Điều này có đúng không? Có sự khác biệt nào khác không?

+0

Bạn có nghĩa là sự khác biệt giữa '[]' và '{}' không? –

+0

Không. Không phải về cú pháp. Tôi đang nói về hành vi và thực hiện. – Eonil

Trả lời

1

Sự khác biệt là:

Object.prototype.toString.call([]); // [object Array] 
Object.prototype.toString.call({}); // [object Object] 

Edit:

Ngoài ra, có một cái nhìn tại phần này từ thông số kỹ thuật ECMAScript vì nó chính xác giải thích những gì một mảng là: http://bclary.com/2004/11/07/#a-15.4

+0

Chỉ là thông tin tôi đã được tìm thấy. Bây giờ tôi có thể xử lý Array như một bảng có, không phải là một mảng kiểu C. Cảm ơn. – Eonil

+0

..tại sao bạn lại bỏ phiếu? – rochal

3

Bạn sai; mảng có thể có bất kỳ phím nào bạn muốn.

Ngoài ra, chúng kế thừa nguyên mẫu Array.

+1

Tôi cũng không nói rằng các mảng có thể có bất kỳ khóa nào. Tôi nghĩ rằng các phím số nguyên được xử lý một cách đặc biệt, trong khi nếu bạn sử dụng một khóa khác, giống như một chuỗi, bạn chỉ cần sử dụng thực tế là một mảng cũng chỉ là một đối tượng. Điều này được phản ánh với 'Array.length' như OP đã nói. –

+0

@Felix: Cách xử lý đặc biệt có thể nhìn thấy duy nhất của các phím số nguyên là thuộc tính 'length'. Mặc dù việc triển khai có thể tối ưu hóa việc sử dụng các phím số nguyên, các tối ưu hóa như vậy phải không có tác dụng phụ. – SLaks

+0

Vì vậy, nó có vẻ là an toàn để điều trị Array như một trường hợp đặc biệt của bản đồ băm. – Eonil

1

Mảng JavaScript cũng được kế thừa từ Object, vì vậy nó sẽ nhận được tất cả các khả năng của một đối tượng. Javascript Mảng có thêm chức năng mặc dù:

var myA = ['foo', 'bar', 'baz']; 
var myO = {0: 'foo', 1: 'bar', 2: 'baz'}; 

// these both give us "foo": 
console.log(myA[0]); 
console.log(myO[0]); 

// array has additional methods, though: 
console.log(myA.pop()); 
console.log(myO.pop()); // <- error 

Trong khi bạn có thể thêm các thuộc tính số nguyên to Objects thường xuyên và thêm các thuộc tính phi nguyên để mảng, điều này sẽ không đưa ra một đối tượng thuộc tính đặc biệt và phương pháp mà Mảng có, và Array Avatar của chức năng đặc biệt chỉ áp dụng cho các thuộc tính có số nguyên của nó.

Một tham chiếu tốt cho tất cả các thuộc tính bổ sung mà Mảng kế thừa là Mozilla Developer Center article on Array. Đảm bảo bạn chú ý đến các ghi chú "không chuẩn" và "Yêu cầu JavaScript 1.x" nếu bạn muốn duy trì tính tương thích của trình duyệt chéo.

+0

myO.pop = function() {return "ne ne ne ne, tôi cũng có thể bật lên!" }; - ở đây bạn đi, một đối tượng (không phải mảng) với làm việc hoàn hảo .pop(). Mã của bạn không chứng minh bất cứ điều gì. – rochal

0

mảng đối tượng có thể có bất kỳ thuộc tính nào mà một đối tượng có thể có. Thuộc tính đặc biệt duy nhất là thuộc tính "length" (có khả năng) được cập nhật khi bạn đặt thuộc tính "chỉ mục mảng" và cũng có thể được sử dụng để xóa phần tử mảng nếu được đặt thành giá trị thấp hơn giá trị hiện tại của nó.

"Chỉ mục mảng" là chuỗi (tất cả thuộc tính đối tượng) là biểu diễn thập phân chuẩn của số nguyên không dấu trong phạm vi 0..2^32-2 (nghĩa là "0" đến "4294967294"). Giới hạn dưới một giá trị tối đa của giá trị không dấu 32 bit vì giá trị trường độ dài luôn là giá trị số nguyên 32 bit không dấu.

Các đối tượng mảng cũng được thừa kế từ Array.prototype (nhưng bạn cũng có thể tạo các đối tượng khác làm điều đó, nếu bạn muốn) và lớp nội bộ của chúng là "Array".

I.e, trong thực tế, khác biệt duy nhất giữa một mảng và đối tượng đối tượng đơn giản là "thuộc tính độ dài ma thuật". Nếu bạn không cần điều đó cho bất cứ điều gì, bạn chỉ nên sử dụng một đối tượng.

+0

myObject.length = function() {return 12}; - cool, bây giờ tôi là một mảng. Một lần nữa - bài viết của bạn không chứng minh bất cứ điều gì và những gì bạn nói chỉ đơn giản là sai. – rochal

Các vấn đề liên quan