2012-08-23 3 views
8

Tôi biết rằng một mảng trong JavaScript không là gì khác ngoài một đối tượng. Khi tôi xác định một mảng như thế:Làm thế nào để sao chép hành vi mảng?

var array; 
array = [ "a", "b", "c" ]; 

và chạy

Object.keys(array); 

tôi nhận được sau mảng: ["0", "1", "2"]. Độ dài mảng là array3.

Khi tôi thêm một tài sản như:

array["a"] = "d"; 

Object.keys() đang trở lại ["0", "1", "2", "a"], nhưng mảng chiều dài của array vẫn là 3.

Nhưng khi tôi thêm một tài sản như thế:

array["3"] = "d"; 

chiều dài của array tại là 4.

Nếu array chỉ là một đối tượng khác, làm cách nào tôi có thể đạt được loại hành vi đó khi tôi khởi động đối tượng của mình từ đầu như var myArray = {}?

+6

[Đọc bài đăng blog cổ điển này từ Kangax] (http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/) - hóa ra bạn không thể làm những gì bạn đang yêu cầu. – Pointy

+0

bản sao có thể có của [Độ dài mảng Javascript không chính xác trên mảng đối tượng] (http://stackoverflow.com/questions/2528680/javascript-array-length-incorrect-on-array-of-objects) – epascarello

Trả lời

1

Thuộc tính .length chỉ bao gồm các thuộc tính có chỉ số, cụ thể là các thuộc tính có giá trị nguyên lớn hơn hoặc bằng không.

Nếu bạn đang hỏi làm thế nào để có được một tổng số của tất cả các phím từ một mảng hoặc một đối tượng sau đó bạn có thể làm:

Object.keys(array).length 

... kể từ Object.keys() trả về một mảng mà chính nó sẽ có tài sản .length.

+0

P.S. Lưu ý rằng '.length' thực sự có thể là _greater_ hơn' Object.keys (mảng) .length' vì (như được chỉ ra bởi Clyde) chiều dài lớn hơn chỉ số nguyên cao nhất, nhưng JS cho phép các mảng thưa thớt và 'Object.keys() 'chỉ trả về các chỉ mục đã thực sự được gán. – nnnnnn

+0

Vì vậy, tôi đoán rằng giá trị của 'độ dài' được tính mỗi khi một thuộc tính mới được thêm vào đối tượng? – Amberlamps

1

Thuộc tính của mảng length là giá trị của chỉ số số cao nhất + 1.

Vì vậy, sau array["3"] = "d"; chỉ số số cao nhất là 3 do đó chiều dài trả 4

Object.keys(array).length nên cung cấp cho bạn độ dài.

+0

'mảng [1000000000] =" x "' không hoạt động theo cách đó. Giới hạn ở đâu? – Amberlamps

+0

Thử 'mảng var; mảng = ["a", "b", "c"]; mảng [1000000000] = 1; mảng.length; ' –

+0

Thêm một' 0' khác vào chỉ mục và thử lại. – Amberlamps