Sự khác biệt giữa javascript Array
và Object
không phải là rất lớn. Trong thực tế có vẻ như Array
chủ yếu là bổ sung thêm lĩnh vực length
, vì vậy bạn có thể sử dụng cả hai Array
s và Object
s như mảng số:Mảng javascript có thực sự được triển khai dưới dạng mảng không?
var ar = new Array();
ar[0] = "foo";
ar["bar"] = "foo";
var ob = new Object();
ob[0] = "foo";
ob["bar"] = "foo";
assert(ar[0] == ob[0] == ar["0"] == ob["0"] == ar.bar == ob.bar); // Should be true.
Vì vậy, câu hỏi của tôi là, trong công cụ javascript phổ biến (V8, JavaScriptCore, SpiderMonkey, vv), cách xử lý này? Rõ ràng chúng tôi không muốn mảng của chúng tôi được lưu trữ dưới dạng bản đồ băm với các giá trị chính! Làm thế nào chúng ta có thể chắc chắn rằng dữ liệu của chúng tôi được lưu trữ như một mảng thực tế?
Theo như tôi có thể thấy có một vài phương pháp tiếp cận cơ có thể mất:
Array
được thực hiện chính xác theo cùng một cách nhưObject
- như một mảng kết hợp với các phím chuỗi.Array
là một trường hợp đặc biệt, với một mảng -likestd::vector
ủng hộ các phím số, và một số heuristic, mật độ để ngăn chặn sử dụng bộ nhớ điên nếu bạn làmar[100000000] = 0;
Array
cũng giống nhưObject
, và tất cả các đối tượng có được một heuristic để xem nếu sử dụng một mảng sẽ có ý nghĩa hơn.- Điều gì đó cực kỳ phức tạp mà tôi chưa từng nghĩ đến.
Thực sự điều này sẽ đơn giản hơn nếu có một loại mảng thích hợp (ho WebGL gõ mảng ho).
Bài viết này (http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics) hơi cũ và không giải thích rõ ràng việc triển khai. Tuy nhiên, nó thực hiện các phép đo hiệu suất chi tiết và đưa ra các triển khai có khả năng. –
Array không phải là _just_ một bản đồ có thuộc tính 'length' được gắn vào. Nếu đúng như vậy, thì việc dịch chuyển hoặc unshifting sẽ phá vỡ việc lập chỉ mục (tức làchuyển một giá trị ra khỏi mảng, và nó vẫn bắt đầu ở chỉ số 0, không phải 1). Vì vậy, có ít nhất một chút nữa. (Không phải điều này nhất thiết phải nói bất cứ điều gì về việc thực hiện, tất nhiên) – Flambino
Tại sao bạn mong đợi 'r [0] == ob [0] == ar [" 0 "] == ob [" 0 "] == ar. bar == ob.bar' là đúng? ''a' == 'a' == 'a'' là sai bởi vì nó đánh giá thành' true ==' a'' để đánh giá thành 'false'. –