2010-11-27 12 views
15

Viele Leute sagen, dass Sie neues Objekt, neues Array() vermeiden und stattdessen {} verwenden sollten. [] und wahr/falsch.Warum verwenden Sie {} anstelle von new Object() und verwenden Sie [] anstelle von new Array() und true/false anstelle von new Boolean()?

Was sind die Vorteile der Verwendung der Literalkonstrukte, um eine neue Instanz eines Objekts oder eines Arrays zu erhalten, anstatt neue zu verwenden? Ich weiß, dass Crockford nicht neu mag, aber ist das das Hauptargument?

+3

'new Boolean (true)' ist nicht gleichbedeutend mit 'true' –

+0

mit dieser Korrektur bearbeitet werden. –

Antwort

8

Die Vorteile des Gegenstandes und Array-Literalen über die jeweiligen Konstruktoren verwenden, sind:

  • Shorter und lesbarer
  • Safer: Literale wird immer noch funktionieren, wenn die Array oder Object Konstruktoren
  • Möglicherweise außer Kraft gesetzt wurden, schneller, obwohl es unwahrscheinlich ist, eine Hauptüberlegung zu sein (irgendwelche Engpässe werden mit ziemlicher Sicherheit anderswo im Code entstehen)

Im Falle von Arrays gibt es einen weiteren Vorteil eines Literals: Es ist unmöglich, ein Array mit einem einzelnen Element zu erstellen, indem nur der Konstruktor Array verwendet wird. Zum Beispiel [3] wird ein Array mit einem Element erstellen, das ist die Nummer 3, während new Array(3) eine Reihe von Länge erzeugt 3.

Update: Der folgende Absatz ist nicht mehr relevant nun die Frage bearbeitet wurde.

In Bezug auf Booleans scheinen Sie ein Missverständnis zu haben: new Boolean(false) ist nicht dasselbe wie false. Der Boolean()-Konstruktor erstellt ein boolesches Objekt, während false und true Boolesche Primitive sind. Tatsächlich wird new Boolean(false) zu true ausgewertet, wenn es in eine Boolean-Anweisung umgewandelt wird, zum Beispiel in eine if-Anweisung.Kurz gesagt, es gibt sehr selten einen Grund, den Boolean() Konstruktor zu verwenden. Verwenden Sie stattdessen true und false. In ähnlicher Weise haben andere Primitive wie Strings und Zahlen entsprechende String() und Number() Konstruktoren, die String und Number Objekte erzeugen, die sich von primitiven Strings und Zahlen unterscheiden und im Allgemeinen vermieden werden sollten.

+0

Bearbeitete die ursprünglichen Fragen, um die falsche wahr/falsch anstelle der neuen Boolean() -Anweisung zu entfernen. –

+2

@Paul: Ich werde die booleschen Sachen in meiner Antwort lassen: es ist immer noch nützliche Informationen. –

+0

ja absolut! Vielen Dank! –

4

Zum Beispiel, wenn Sie dies tun wollen:

{name:"bla",address:"address"} 

das neue Object() Weg wäre:

var o = new Object(); 
o.name="bla"; 
o.address="address"; 

Die erste ist viel kürzer. Und ich denke, dass es auch in vielen Browsern schneller wäre (jsperf testcase).

+0

Schneller, ja. Vor einigen Jahren habe ich die 'new Array()' Methode versucht und dann alle Werte mit 'arr.push()' hinzugefügt - es gab tausende von Werten die ich hinzufügen konnte (ich hatte kein Leben = _ =) und es war langsam wie .. fudge. Einfach alle Werte in den Array-Konstruktor 'new Array (val1, val2, val3 ...)' zu setzen, war enorm schneller! –

+1

@Kolink - Wahrscheinlich weil Sie '.push()' aufgerufen haben. Die Frage hier ist mehr über Konstruktor 'neues Array (val1, val2, val3 ...)' vs literal '[val1, val2, val3 ...]' – user113716

+0

'neues Object()' und 'neues Array()' sind viel schneller, wenn Sie eine Menge von ihnen konstruieren müssen und dann sehr oft Daten setzen/anhängen. In einem Parser/Decoder gibt es einen spürbaren Geschwindigkeitsgewinn bei der Verwendung. –

3

Ich denke, es geht hauptsächlich um Prägnanz.

Warum schreiben new Array() wenn Sie [] schreiben kann, oder new Object() wenn Sie {} schreiben können?

Auch new Boolean() ist völlig redundant. Ein Boolescher Wert muss immer entweder wahr oder falsch sein, also sollten Sie die eingebauten Konstanten dafür verwenden.

+0

'new Boolean (true)' ist schlechter als redundant, es ist anders als das primitive 'true'. Siehe meine Antwort. –

1

In den meisten Fällen ist ein object literal oder Array-Literal ausreichend und einfacher zu verwenden. Sie können sogar Prototyp-Methoden aufrufen oder anwenden (z. B. [] .prototype.slice.call (someObj)). Es ist meistens auch faster. Vielleicht möchten Sie bemerken, dass der Konstruktor von {} und [] nicht überschrieben werden kann und dass Object und Array Konstruktoren sind, in denen {} und [] Instanzen sind.

+0

Ich habe den Jsperf-Test ausgeführt, mit dem Sie eine Verbindung herstellen, und die Literale sind die langsamsten der drei (_on my machine_). Ich vermute, das ist auf Firefox 3.6.12 –

+0

Ich führte die Tests in Chrome, wo die Verwendung von Literalen war schneller. Wenn Sie auf der Seite jsperf nach unten scrollen, gibt es einige zusätzliche Ergebnisse von 'browserscope' – KooiInc

0

Ein Grund, der noch nicht erwähnt wurde, ist die Mehrdeutigkeit bei der Übergabe von Parametern an den Array-Konstruktor. Es ist alles spezifiziertes Verhalten, es ist nur schrullig.

new Array(1,2,3); // [1,2,3], that's OK 
new Array(1); // [undefined], some may expect to get [1] instead 

A JavaScript-Array wird mit den angegebenen Elementen initialisiert, außer in dem Fall, in dem ein einziges Argument an das Array Konstruktor übergeben wird und dieses Argument eine Zahl ist. (Siehe unten.) Beachten Sie, dass dieser spezielle Fall nur für JavaScript-Arrays gilt, die mit dem Array-Konstruktor erstellt wurden, nicht für Array-Literale, die mit der Klammersyntax erstellt wurden. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Syntax

Verwandte Themen