Tôi đã có một số mã JS cũ để tạo cấu trúc đối tượng lồng nhau khổng lồ với []. Mã sẽ giống như thế nàyCó {} tiêu thụ ít bộ nhớ hơn [] cho các đối tượng lồng nhau trong Javascript không?
var data = [];
data ["first"] = [];
data ["first"]["second"] = [];
data ["first"]["second2"] = "hello";
Đó là khoảng 250+ KB javascript, khá lớn. Khi tôi cố gắng quấn nó xung quanh với requirejs để tải vào một mô-đun requirejs khác, nó ném ra khỏi lỗi bộ nhớ.
Lỗi sẽ biến mất nếu tôi sử dụng {} nơi tôi đang sử dụng [].
Tôi đã làm một số bài tập về nhà vào ngày cuối tuần và nguyên nhân có vẻ là sử dụng các mảng liên quan như từ điển lồng nhau có thể bị rò rỉ trong Javascript vì mảng mở rộng đối tượng JS và có thể có nhiều nội dung cập nhật hơn khi thêm các đối tượng mới vào nó. Nhưng nó giải thích vấn đề tiêu thụ bộ nhớ? Hoặc nó liên quan đến cách Requirejs phân tích cú pháp đối tượng của mô-đun?
Tôi không có đủ kiến thức về cách thực hiện công cụ bộ nhớ JS và so sánh giữa việc sử dụng {} hoặc [] trong công cụ trình duyệt, do đó khó có thể đạt được kết luận. Bất kỳ gợi ý hay gợi ý nào về cách sử dụng công cụ {} so với [] sẽ được hoan nghênh.
Cập nhật: Tôi đã thử một số sizeOf() qua nút ngày hôm qua. Tôi đã sử dụng tất cả những cái hiện có: "js-sizeof", "đối tượng sizeof", "sizeof"
Code:
var sizeof = require('object-sizeof');
var obj = [];
obj['ball'] = 'hello';
obj['air'] = 'hello';
obj['ball']['fire'] = 'world';
obj['ball']['ice'] = [];
console.log(sizeof(obj));
var obj2 = {};
obj2['ball'] = 'hello';
obj2['air'] = 'hello';
obj2['ball']['fire'] = 'world';
obj2['ball']['ice'] = [];
console.log(sizeof(obj2));
Kết quả là
[]: 34 {} : 34
Kích thướcOf thực sự giống nhau., Nhưng có thể xảy ra sự cố khác với [] có thể kích hoạt vấn đề bộ nhớ. Tôi không chắc chắn nếu nó là requirejs phân tích cú pháp nó kích hoạt nó hoặc một số đường dẫn tối ưu hóa V8. Tôi không nghĩ rằng các công cụ Lint thậm chí còn đề xuất chống lại thực hành này nên nó khá mơ hồ theo cách nào là cách "đúng" trong thực tế
chúng là tất cả các đối tượng, nhưng nếu có, '{}' sẽ tiêu thụ nhiều hơn vì bạn phải lưu trữ chuỗi khóa, thay vì chỉ là một chỉ số nguyên. –
@MarcB: Sai. Điều đó sẽ phụ thuộc vào những gì bạn sử dụng phím, không cho dù đó là một mảng. – SLaks
[Sử dụng mảng cho mục đích này chỉ là sai] (http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/). Không quan trọng là họ tiêu thụ nhiều bộ nhớ hơn. – Bergi