Ich hatte einen älteren JS-Code, der eine riesige verschachtelte Objektstruktur mit [] erstellt. Der Code geht etwas wie diesesNimmt {} weniger Speicherplatz als [] für verschachtelte Objekte in Javascript auf?
var data = [];
data ["first"] = [];
data ["first"]["second"] = [];
data ["first"]["second2"] = "hello";
Es geht um mehr als 250 KB von Javascript, die ziemlich groß ist. Wenn ich versuche, es mit requirys zu umbrechen, um es in ein anderes requestejs-Modul zu laden, wird der Fehler "Nicht genügend Arbeitsspeicher" ausgegeben.
Der Fehler verschwindet, wenn ich {} verwende, wo ich [] verwendet habe.
Ich habe am Wochenende einige Hausaufgaben auf [] vs. {} gemacht und die Ursache scheint zu sein, dass die Verwendung assoziierter Arrays als verschachtelte Wörterbücher in Javascript undicht sein kann, da Array ein JS-Objekt erweitert und möglicherweise mehr Update-Sachen haben wenn neue Objekte hinzugefügt werden. Aber erklärt es das Speicherverbrauchsproblem? Oder hängt es damit zusammen, wie Requirejs das Objekt eines Moduls analysiert?
Ich habe nicht genug Kenntnisse über JS Speicher Instrumentierung und Vergleiche zwischen der Verwendung von {} oder [] in Browser-Engines, so dass es schwierig ist, Schlussfolgerungen zu erzielen. Jeder Hinweis oder Vorschlag, wie man {} vs. [] instrumentiert, wäre willkommen.
Update: Ich versuchte gestern einige sizeOf() über Knoten. Früher habe ich alle der bestehenden: "js-sizeof", "Objekt-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));
Die Ergebnisse ist
[]: 34 {} : 34
Die sizeOf ist eigentlich die gleiche., Aber vielleicht etwas anderes passiert mit [], die Speicherproblem auslösen könnte. Ich bin mir nicht sicher, ob es die Anforderungen sind, die es analysieren, die es oder einen V8-Optimierungspfad auslösen. Ich glaube nicht, dass die Lint-Werkzeuge sogar gegen diese Praxis sprechen, daher ist es eher zweideutig, welcher Weg der "richtige" Weg in der Praxis ist.
Sie sind alle Objekte, aber wenn, ''} wird mehr konsumieren, da Sie die Zeichenfolge des Schlüssels anstelle nur eines ganzzahligen Indexes speichern müssen. –
@MarcB: Falsch. Das hängt davon ab, welche Tasten Sie verwenden, nicht ob es ein Array ist. – SLaks
[Array für diesen Zweck ist einfach falsch] (http://andrewdupont.net/2006/05/18/jacascript-associative-arrays-consided-harmful/). Es spielt keine Rolle, dass sie auch mehr Speicher verbrauchen. – Bergi