2013-03-27 25 views
35

ich häufig sehen Entwickler einen Ausdruck wie die in JavaScript folgenden verwenden:Gibt es einen Grund, warum JavaScript-Entwickler Array.push() nicht verwenden?

arr = [] 
arr[arr.length] = "Something" 
arr[arr.length] = "Another thing" 

Würde push nicht besser geeignet sein?

arr = [] 
arr.push("Something") 
arr.push("Another thing") 
+2

Ich realisiere, dass ich nur ein Hobbyist bin, aber ich benutze 'push()', und jetzt habe ich das Gefühl, dass mir eine bisher geheime Kontraindikation für eine solche Verwendung fehlt ... –

+0

Ich benutze es häufig, obwohl Ich bevorzuge einen Indexer, bei dem es logischer Sinn ist (wie eine For-Schleife). –

+0

Leute denken manchmal, dass es schneller ist. Siehe [Warum ist array.push manchmal schneller als array \ [n \] = value?] (Http://stackoverflow.com/questions/614126/why-is-array-push-ometimes-faster-than-arrayn-value) und [Verwenden der Push-Methode oder. Länge beim Hinzufügen zum Array?] (http://StackOverflow.com/q/6772757/1048572) - Ergebnisse variieren so weit, dass es eigentlich irrelevant ist. Verwenden Sie, was besser zu verstehen ist. – Bergi

Antwort

48

Ich fragte mich eigentlich die gleiche Frage zu Beginn dieses Jahres. AKTUALISIERT mit neuen Testfällehttp://jsperf.com/array-push-vs-unshift-vs-direct-assignment/2

Es scheint, dass push viel schneller in Chrom ist, und etwa gleich FF. Auch ist Direct in IE9 schneller, aber ich würde gerne sehen, wie es in IE10 funktioniert.

Ich würde sagen, dass die meisten Entwickler davon ausgehen würden, die Länge des Arrays zu setzen, und dann ist die direkte Zuweisung schneller, wie es bei den meisten Programmiersprachen der Fall ist. Aber JavaScript ist anders. Javascript arrays aren't really arrays, sie sind nur Schlüssel/Wert-Karten wie alle anderen JavaScript-Objekte. Die Vorzuteilung fällt also im Wesentlichen auf taube Ohren.

Persönlich bevorzuge ich push (:

+1

+1 - ein paar IE 10 Läufe für Sie hinzugefügt. –

+0

Meine Annahme war Leistung. Und zu einem bestimmten Zeitpunkt wäre es sicherlich schneller gewesen, 'push()' zu vermeiden. Sicherlich nicht mehr obwohl! +1 – svidgen

+4

Die direkte Zuweisung ist in neueren Versionen von Chrome erheblich schneller geworden. Direkte Zuweisung (auch mit .length) ist jetzt fast doppelt so schnell wie mit Push. – AgDude

4

Ich glaube, dass es meist Gewohnheit ist

Einige Entwickler es einfach verwenden, da es die Möglichkeit gibt, sie verwendet werden, es zu tun, und haben nicht berücksichtigt, dass push wäre. eine Alternative.

Einige Entwickler früher einmal gelernt haben, dass ein Verfahren viel schneller als andere, und haben nicht diese in Anbetracht der jüngsten Performance-Verbesserungen der Javascript-Motoren überprüft.

Persönlich verwende ich häufig push. Meistens ist Lesbarkeit und Wartbarkeit wichtiger als Leistung, zumindest wenn der Leistungseinfluss klein genug ist. Die Leistungstests in den Antworten zeigen, dass der Leistungsunterschied zwischen den verschiedenen Methoden nicht sehr groß ist.

+0

+1, ist es definitiv. Und nicht nur der Leistungsunterschied ist klein, sondern wechselt zwischen jedem Testfall und Browser-Version :-) – Bergi

1

Es ist eine Möglichkeit, verschachtelte Braclets zu begrenzen. Wenn Sie genug von ihnen haben, können Sie nicht sehen, wie viele es gibt oder wie viel Sie brauchen (wenn Sie später auf den Code schauen). Ich würde eine Var verwenden, man sollte die Dinge nur einmal zählen müssen.

bar = foo.length; 
foo[ bar++ ] = "new item 0"; 
foo[ bar++ ] = "new item 1"; 
foo[ bar++ ] = "new item 2"; 
foo[ bar++ ] = "new item 3"; 

http://jsfiddle.net/vEUU3/

1

Sehr oft, wenn ich ein Objekt in ein Array bin drängen, mag ich die Referenz auf das Objekt zu mir zurückgeschickt werden. Zum Beispiel:

// Returns object 
function createAndAdd(arr) { 
    return arr[arr.length] = { id: 1 }; 
} 
var obj = createAndAdd(arr); 

Jetzt habe ich das neue Objekt und Ich habe es zu einem Array hinzugefügt. Wenn ich Push benutzt hätte, wäre mir die Länge des Arrays zurückgegeben worden. Es würde wie folgt aussehen:

function createAndAdd(arr) { 
    var obj = { id: 1 }; 
    arr.push(obj); 
    return obj; 
} 

oder sogar hässliche, vor allem, wenn das Objekt bekommt groß:

function createAndAdd(arr) { 
    return arr[arr.push({ id: 1 }) -1]; 
} 

Ich persönlich liebe Funktionen mit sofortigen return-Anweisungen. Hält es einfach und leicht zu sehen. Liebe die Frage. Danke, dass du es fragst.

0

Die Array.prototype.push-Methode gibt die Länge des aktualisierten Arrays zurück, während die direkte Deklaration den Wert zurückgibt, der zugewiesen wird. Das ist der einzige Unterschied, den ich sehe, aber ich lese in der Regel einige Best-Practice-Empfehlungen darüber, dass die Push-Methode eine bessere Methode ist, einem Array neue Werte zuzuweisen.

-1

Ich denke, es ist nicht über die Leistung, oder zumindest nicht so eine große Sache ... was wirklich hier ist deklarative Weg vs Imperativ Art und Weise ankommt.

Verwandte Themen