Was ist der Unterschied zwischen "Array ()" und "[]" beim Deklarieren eines JavaScript-Arrays?

841

Was ist der wahre Unterschied zwischen der Deklaration eines Arrays wie folgt:

var myArray = new Array();

und

var myArray = [];
Amr Elgarhy
quelle
[]Token : ARRAY_INIT; new ArrayToken : NEW, IDENTIFIER; new Array()Token:NEW, IDENTIFIER, CALL
Noobninja

Antworten:

951

Es gibt einen Unterschied, aber in diesem Beispiel gibt es keinen Unterschied.

Verwenden der ausführlicheren Methode: new Array()Hat eine zusätzliche Option in den Parametern: Wenn Sie eine Zahl an den Konstruktor übergeben, erhalten Sie ein Array dieser Länge:

x = new Array(5);
alert(x.length); // 5

So veranschaulichen Sie die verschiedenen Möglichkeiten zum Erstellen eines Arrays:

var a = [],            // these are the same
    b = new Array(),   // a and b are arrays with length 0

    c = ['foo', 'bar'],           // these are the same
    d = new Array('foo', 'bar'),  // c and d are arrays with 2 strings

    // these are different:
    e = [3]             // e.length == 1, e[0] == 3
    f = new Array(3),   // f.length == 3, f[0] == undefined

;

Ein weiterer Unterschied besteht darin, dass Sie bei Verwendung new Array()die Größe des Arrays festlegen können, was sich auf die Stapelgröße auswirkt. Dies kann nützlich sein, wenn Stapelüberläufe auftreten ( Leistung von Array.push vs Array.unshift ). Dies geschieht, wenn die Größe des Arrays die Größe des Stapels überschreitet und neu erstellt werden muss. Je nach Anwendungsfall kann es also tatsächlich zu einer Leistungssteigerung bei der Verwendung kommen, new Array()da Sie verhindern können, dass der Überlauf auftritt.

Wie in dieser Antwort ausgeführt , new Array(5)werden undefineddem Array nicht fünf Elemente hinzugefügt . Es wird einfach Platz für fünf Elemente hinzugefügt. Beachten Sie, dass es auf Arraydiese Weise schwierig ist, sich auf array.lengthBerechnungen zu verlassen .

nickf
quelle
66
Das ist etwas falsch. Es gibt einen sehr wichtigen Unterschied zwischen new Array () und [], auf den ich in meiner Antwort näher eingehen werde.
Coderjoe
30
Aber wie in Ihrer Antwort erwähnt, ist es nur anders, wenn Sie völlig verrückt sind und die Array-Funktion überschreiben.
Nickf
19
Nun, die Wichtigkeit ist, dass die Verwendung des neuen Operators den Interpreter dazu veranlasst, alle möglichen zusätzlichen Schritte zu unternehmen, um zum globalen Bereich zu gelangen, nach dem Konstruktor zu suchen, den Konstruktor aufzurufen und das Ergebnis zuzuweisen ... was in den meisten Fällen der Fall sein wird aa Laufzeitarray. Sie können den Aufwand für die Suche nach dem globalen Konstruktor vermeiden, indem Sie nur [] verwenden. Es mag klein erscheinen, aber wenn Sie in Ihrer App nahezu in Echtzeit arbeiten, kann dies einen Unterschied machen.
Coderjoe
5
Es gibt einen großen Leistungsunterschied: jsperf.com/create-an-array-of-initial-size/2
Marco Luglio
4
Stimmt, aber Sie benötigen an den meisten Stellen, an denen ich sie hinzufüge, auch keine Semikolons oder Zeilenumbrüche. Es geht um Konsistenz und Lesbarkeit. Sie wissen, IMHO.
Nickf
774

Der Unterschied zwischen dem Erstellen eines Arrays mit dem impliziten Array und dem Array-Konstruktor ist subtil, aber wichtig.

Wenn Sie ein Array mit erstellen

var a = [];

Sie weisen den Interpreter an, ein neues Laufzeitarray zu erstellen. Keine zusätzliche Verarbeitung erforderlich. Erledigt.

Wenn du benutzt:

var a = new Array();

Sie sagen dem Interpreter, ich möchte den Konstruktor " Array" aufrufen und ein Objekt generieren. Anschließend wird in Ihrem Ausführungskontext nach dem aufzurufenden Konstruktor gesucht und aufgerufen, wodurch Ihr Array erstellt wird.

Sie denken vielleicht "Nun, das spielt überhaupt keine Rolle. Sie sind gleich!". Das kann man leider nicht garantieren.

Nehmen Sie das folgende Beispiel:

function Array() {
    this.is = 'SPARTA';
}

var a = new Array();
var b = [];

alert(a.is);  // => 'SPARTA'
alert(b.is);  // => undefined
a.push('Woa'); // => TypeError: a.push is not a function
b.push('Woa'); // => 1 (OK)

Im obigen Beispiel alarmiert der erste Anruf 'SPARTA' wie erwartet. Der zweite wird nicht. Sie werden am Ende undefiniert sehen. Sie werden auch feststellen, dass b alle nativen Array-Objektfunktionen enthält, z. B. pushwo das andere nicht.

Während Sie dies erwarten können, zeigt es nur die Tatsache, dass dies []nicht dasselbe ist wie new Array().

Es ist wahrscheinlich am besten, nur zu verwenden, []wenn Sie wissen, dass Sie nur ein Array möchten. Ich schlage auch nicht vor, herumzugehen und Array neu zu definieren ...

coderjoe
quelle
157
Gut zu wissen, nehme ich an. Welche Art von Person die Array-Klasse überschreiben würde, weiß ich nicht ...
Nickf
160
Du hast absolut recht. Nur ein Verrückter würde die Array-Klasse überschreiben. Nehmen Sie sich jetzt einen Moment Zeit und überlegen Sie, welche zusätzlichen Arbeiten der Interpreter mit new Array () unternimmt, um diese Verrückten zu unterstützen. Ich vermeide einfach alles zusammen mit [].
Coderjoe
51
Gutes Beispiel für die Art der globalen Verschmutzung, die mit JavaScript möglich ist.
David Snabel-Caunt
8
Beachten Sie, dass das neue Array (Größe) schneller ist als andere mögliche Methoden mit der Notation []. Quelle: jsperf.com/create-an-array-of-initial-size/2
Marco Luglio
9
Leider ist dieser Test nicht ordnungsgemäß vorbereitet. Es wird eine Initialisierung eines Arrays mit Initialisierungen von Arrays getestet, gefolgt von einem Array-Zugriff. Es gibt keine Kontrolle, um zu beweisen, dass die Browser den Speicher tatsächlich vorab zuweisen (was in der Spezifikation nicht angegeben ist). Wenn wir davon ausgehen können, dass der Array-Zugriff konstant ist und die meiste Zeit für die Zuweisung von Speicher in beiden Beispielen aufgewendet wird, ist [] möglicherweise vorzuziehen, wenn Sie Millionen von Arrays instanziieren. jsperf.com/array-instanciation
coderjoe
95

Es gibt einen wichtigen Unterschied, den noch keine Antwort erwähnt hat.

Davon:

new Array(2).length           // 2
new Array(2)[0] === undefined // true
new Array(2)[1] === undefined // true

Du denkst vielleicht, das new Array(2)ist gleichbedeutend mit [undefined, undefined], aber es ist NICHT!

Versuchen wir es mit map():

[undefined, undefined].map(e => 1)  // [1, 1]
new Array(2).map(e => 1)            // "(2) [undefined × 2]" in Chrome

Sehen? Die Semantik ist völlig anders! Warum ist das so?

Gemäß ES6 Spec 22.1.1.2 besteht die Aufgabe von Array(len)lediglich darin, ein neues Array zu erstellen, dessen Eigenschaft lengthauf das Argument festgelegt ist, lenund das ist es, was bedeutet, dass sich in diesem neu erstellten Array kein echtes Element befindet .

Die Funktion map()gemäß Spezifikation 22.1.3.15 würde zuerst prüfen und HasPropertydann den Rückruf aufrufen, aber es stellt sich heraus, dass:

new Array(2).hasOwnProperty(0) // false
[undefined, undefined].hasOwnProperty(0) // true

Und deshalb können Sie keine iterierenden Funktionen erwarten, die wie gewohnt auf Arrays funktionieren, die aus erstellt wurdennew Array(len) .

Übrigens haben Safari und Firefox ein viel besseres "Drucken" für diese Situation:

// Safari
new Array(2)             // [](2)
new Array(2).map(e => 1) // [](2) 
[undefined, undefined]   // [undefined, undefined] (2) 

// Firefox
new Array(2)             // Array [ <2 empty slots> ]
new Array(2).map(e => 1) // Array [ <2 empty slots> ]
[undefined, undefined]   // Array [ undefined, undefined ]

Ich habe Chromium bereits ein Problem gemeldet und sie gebeten, dieses verwirrende Drucken zu beheben: https://bugs.chromium.org/p/chromium/issues/detail?id=732021

UPDATE: Es ist bereits behoben. Chrome wird jetzt gedruckt als:

new Array(2)             // (2) [empty × 2]
Hux
quelle
22
Ihre ist die einzige tatsächliche Antwort
Victor
Dies ist sinnvoll. Ich bin gerade auf ein anderes Konstrukt gestoßen, für [...Array(2)]das ich keine dokumentierten Referenzen finden kann. Dies entspricht dem [undefined, undefined]Standpunkt der Ergebnisse.
Roberto Andrade
Die Antwort auf meine vorherigen Kommentare lautet anscheinend "Spread-Operator": javascript.info/rest-parameters-spread-operator
Roberto Andrade
@RobertoAndrade, die sinnvoll sind, weil der Spread-Operator die Einträge ablesen muss, damit er das Kopieren anwenden kann ... und das Lesen eines solchen leeren Steckplatzes undefinedwie gewohnt.
Hux
51

Seltsamerweise new Array(size)ist es fast 2x schneller als []in Chrome und ungefähr gleich in FF und IE (gemessen durch Erstellen und Füllen eines Arrays). Es ist nur wichtig, wenn Sie die ungefähre Größe des Arrays kennen. Wenn Sie mehr Elemente als die von Ihnen angegebene Länge hinzufügen, geht die Leistungssteigerung verloren.

Genauer gesagt: Array(ist eine schnelle Operation mit konstanter Zeit, die keinen Speicher zuweist, während []es sich um eine lineare Zeitoperation handelt, die Typ und Wert festlegt.

gblazex
quelle
3
Ich habe es viel in Node.js getestet: Wenn Sie eine bestimmte Anzahl von Elementen in Array setzen müssen, new Array(length)auf 0 <= Größe <= ~ 1000, auf Größe> ~ 1000 gewinnt[]
Glukki
1
Überprüfen Sie diese stackoverflow.com/questions/7375120/…
Xsmael
40

Weitere Informationen finden Sie auf der folgenden Seite , warum Sie diese niemals verwenden müssennew Array()

Sie müssen nie new Object()in JavaScript verwenden. Verwenden Sie {} stattdessen das Objektliteral . Verwenden Sie in ähnlicher Weise nicht new Array()das Array-Literal [] . Arrays in JavaScript funktionieren nicht wie Arrays in Java, und die Verwendung der Java-ähnlichen Syntax wird Sie verwirren.

Verwenden Sie nicht new Number, new Stringoder new Boolean. Diese Formulare erzeugen unnötige Objektverpackungen. Verwenden Sie stattdessen einfach einfache Literale.

Lesen Sie auch die Kommentare - das new Array(length)Formular erfüllt keinen nützlichen Zweck (zumindest in den heutigen Implementierungen von JavaScript).

BarelyFitz
quelle
3
Crockford sagt auch, dass er [] anstelle von new Array () verwenden soll. Leider sagt er im verlinkten Artikel nicht warum. Ich nehme an, es ist nur eine Frage des Platzes und der Geschwindigkeit. javascript.crockford.com/code.html
Nosredna
4
Crockford ist kein Fan der Verwendung des Schlüsselworts "new", um eine neue Instanz eines Objekts in Javascript zu erstellen. In Vorträgen erklärte er, es sei seine Überzeugung, dass dies zu Mehrdeutigkeiten führt und nicht gut zur Vererbung des Prototypstils von Javascript passt. Er bezieht sich speziell auf vom Benutzer erstellte Objektkonstruktoren, aber angesichts dieser Überzeugung ist es leicht zu verstehen, warum er empfehlen würde, es nicht auch mit den integrierten Objekten zu verwenden, wenn es eine alternative Syntax gibt.
Alan Storm
@ Alan Storm: Zumindest für Number, String und Boolean sagt er, "diese Formulare erzeugen unnötige Objekt-Wrapper", aber ich denke, das würde nicht für Array gelten.
BarelyFitz
10

Zum besseren Verständnis []und new Array():

> []
  []
> new Array()
  []
> [] == []
  false
> [] === []
  false
> new Array() == new Array()
  false
> new Array() === new Array()
  false
> typeof ([])
  "object"
> typeof (new Array())
  "object"
> [] === new Array()
  false
> [] == new Array()
  false

Das obige Ergebnis stammt von der Google Chrome-Konsole unter Windows 7.

Peter Lee
quelle
4
aber warum ist [] == [] oder [] === [] falsch?
Anu
5
"Ein Ausdruck, der Objekte vergleicht, ist nur wahr, wenn die Operanden auf dasselbe Objekt verweisen." (Quelle: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )
srph
Diese Antwort enthält Beispiele, die implizieren, dass die beiden Konstrukte identisch sind. Andere Beiträge auf dieser Seite weisen auf die Unterschiede hin, wie z. B. Array(3)oder new Array(3)nicht [3].
Ggorlen
8

Der erste ist der Standardaufruf des Objektkonstruktors. Sie können die Parameter verwenden, wenn Sie möchten.

var array = new Array(5); //initialize with default length 5

Mit dem zweiten können Sie ein nicht leeres Array erstellen:

var array = [1, 2, 3]; // this array will contain numbers 1, 2, 3.
Bogdan Gusiev
quelle
1
Mit dem ausführlichen Konstruktor können Sie dasselbe tun: var array = new Array (1, 2, 3);
Nickf
Dann können Sie wohl var array = [5]die eckigen Klammern verwenden, aber nicht den Konstruktor, da var array = Array(5)ein leeres Array mit 5 Elementen erstellt wird.
CDMckay
cdmckay - das ist falsch. var a = [5] wäre ein Array mit einem einzelnen Element - der Nummer fünf.
BarelyFitz
2
@ BarelyFitz: Das habe ich gesagt. In Bogdans 'Antwort sagt er, dass der Konstruktoraufruf nicht verwendet werden kann, um ein Array zu initialisieren, aber er hat sich geirrt. Mein Kommentar diente lediglich der Klarstellung, dass Sie den Konstruktoraufruf nicht zum Initialisieren eines Arrays eines einzelnen Elements verwenden können.
CDMckay
1
@cdmckay: Entschuldigung, ich habe Ihren Kommentar falsch verstanden. Zur Verdeutlichung: neues Array (arg) - Wenn arg numerisch ist, wird ein leeres Array mit der Länge = arg erstellt. neues Array (arg1, arg2) - Erstellt ein neues Array und initialisiert die Array-Elemente. Wenn Sie also ein Array mit einem numerischen Element wie [5] erstellen möchten, können Sie dies nicht mit dem neuen Array (5) tun. Aber eigentlich sollten Sie niemals ein neues Array () verwenden, daher ist dies ein strittiger Punkt.
BarelyFitz
5

Ich kann es anhand dieses Beispiels, das auf Fredriks gutem basiert, genauer erklären.

var test1 = [];
test1.push("value");
test1.push("value2");

var test2 = new Array();
test2.push("value");
test2.push("value2");

alert(test1);
alert(test2);
alert(test1 == test2);
alert(test1.value == test2.value);

Ich habe gerade einen weiteren Wert zu den Arrays hinzugefügt und vier Warnungen ausgegeben: Die erste und die zweite sollen uns den in jedem Array gespeicherten Wert geben, um sicherzugehen, welche Werte vorliegen. Sie werden das gleiche zurückgeben! Versuchen Sie es jetzt mit dem dritten, es gibt false zurück, das liegt daran

JS behandelt test1 als VARIABLE mit einem Datentyp eines Arrays und test2 als OBJECT mit der Funktionalität eines Arrays , und hier gibt es nur wenige geringfügige Unterschiede.

Der erste Unterschied besteht darin, dass beim Aufrufen von test1 eine Variable aufgerufen wird, ohne darüber nachzudenken. Es werden nur die Werte zurückgegeben, die in dieser Variablen gespeichert sind, unabhängig von ihrem Datentyp! Wenn wir jedoch test2 aufrufen, ruft es die Funktion Array () auf und speichert dann unsere "Pushed" -Werte in seiner "Value" -Eigenschaft. Dasselbe passiert, wenn wir test2 alarmieren, gibt es die "Value" -Eigenschaft des Array-Objekts zurück.

Wenn wir also prüfen, ob test1 gleich test2 ist, werden sie natürlich niemals true zurückgeben. Eine ist eine Funktion und die andere ist eine Variable (mit einem Array-Typ), selbst wenn sie denselben Wert haben!

Um sicherzugehen, versuchen Sie es mit der 4. Warnung, der der Wert hinzugefügt wurde. es wird wahr zurückgeben. In diesem Fall teilen wir JS mit: "Wenn Sie den Typ des Containers nicht berücksichtigen, ob es sich um eine Funktion oder eine Variable handelt, vergleichen Sie bitte die in jedem Container gespeicherten Werte und teilen Sie uns mit, was Sie gesehen haben!" Genau das passiert.

Ich hoffe, ich habe die Idee dahinter klar gesagt und entschuldige mich für mein schlechtes Englisch.

Kholio
quelle
19
Es ist erstaunlich, dass solch ein vollständiger und völliger Unsinn gewählt wurde. Der Vergleich zwischen den Arrays ist unabhängig davon, wie Sie sie erstellen, falsch, da die Objektidentität verglichen wird und es sich um unterschiedliche Objekte handelt. Arrays haben keine value-Eigenschaft. []und new Array()ist identisch; .valuewird undefinedin beiden Fällen sein, und ein Vergleich wird immer falsch sein.
Slikts
Einverstanden macht diese Antwort keinen Sinn und zeigt nichts. Es gibt keine array.value. und beides typeof []und typeof new Array()zurück object. Array.isArray
Dies
4

Es gibt keinen Unterschied, wenn Sie ein Array ohne Länge initialisieren. Also var a = []& var b = new Array()ist gleich.

Wenn Sie jedoch ein Array mit einer Länge wie initialisieren var b = new Array(1);, wird die Länge des Array-Objekts auf 1 gesetzt var b = []; b.length=1;.

Dies ist problematisch, wenn Sie array_object.push ausführen, ein Element nach dem letzten Element hinzufügen und die Länge erhöhen.

var b = new Array(1);
b.push("hello world");
console.log(b.length); // print 2

vs.

var v = [];
a.push("hello world");
console.log(b.length); // print 1
Aniruddha
quelle
3

Der erste ist der Standardaufruf des Objektkonstruktors, der hauptsächlich für dynamische Werte verwendet wird.

var array = new Array(length); //initialize with default length

Das zweite Array wird beim Erstellen statischer Werte verwendet

var array = [red, green, blue, yellow, white]; // this array will contain values.
Parth Raval
quelle
3

Es gibt keinen großen Unterschied, sie machen im Grunde das Gleiche, aber auf unterschiedliche Weise, aber lesen Sie weiter, sehen Sie sich diese Aussage bei W3C an:

var cars = ["Saab", "Volvo","BMW"];

und

var cars = new Array("Saab", "Volvo", "BMW");

Die beiden obigen Beispiele machen genau das Gleiche. Es ist nicht erforderlich, ein neues Array () zu verwenden.
Verwenden Sie zur Vereinfachung, Lesbarkeit und Ausführungsgeschwindigkeit die erste (die Array-Literal-Methode).

Gleichzeitig wird das Erstellen eines neuen Arrays mithilfe der new ArraySyntax als schlechte Vorgehensweise angesehen:

Vermeiden Sie neues Array ()

Es ist nicht erforderlich, den in JavaScript integrierten Array-Konstruktor new Array () zu verwenden.
Verwenden Sie stattdessen [].
Diese beiden unterschiedlichen Anweisungen erstellen ein neues leeres Array mit dem Namen points:

var points = new Array();         // Bad
var points = [];                  // Good 

Diese beiden unterschiedlichen Anweisungen erstellen ein neues Array mit 6 Zahlen:

var points = new Array(40, 100, 1, 5, 25, 10); // Bad    
var points = [40, 100, 1, 5, 25, 10];          // Good

Das neue Schlüsselwort verkompliziert nur den Code. Es kann auch zu unerwarteten Ergebnissen führen:

var points = new Array(40, 100);  // Creates an array with two elements (40 and 100)

Was ist, wenn ich eines der Elemente entferne?

var points = new Array(40);       // Creates an array with 40 undefined elements !!!!!

Also grundsätzlich nicht als Best Practice angesehen, da gibt es auch einen kleinen Unterschied, man kann die Länge so übergehen new Array(length), was auch kein empfohlener Weg ist.

Alireza
quelle
Hallo Alireza, werden diese von irgendwoher kopiert und eingefügt? Bitte fügen Sie einen Link zu der Seite hinzu, von der der Text kopiert wird. Weitere Informationen finden Sie auf dieser Hilfeseite. Vielen Dank.
Pang
Nützlich fürnew Array(40).fill(123)
gman
2

Der Unterschied bei der Verwendung

var arr = new Array(size);

Oder

arr = [];
arr.length = size;

Wie in dieser Frage genug diskutiert.

Ich möchte das Geschwindigkeitsproblem hinzufügen - der derzeit schnellste Weg google chromeist der zweite.

Aber pass auf, diese Dinge ändern sich mit Updates sehr. Auch die Laufzeit unterscheidet sich zwischen verschiedenen Browsern.

Zum Beispiel - die zweite Option, die ich erwähnt habe, läuft mit 2 Millionen [ops / Sekunde] weiter chrome, aber wenn Sie sie anprobieren mozilla dev.würden, würden Sie eine überraschend höhere Rate von 23 Millionen erhalten.

Wie auch immer, ich würde vorschlagen, dass Sie es von Zeit zu Zeit in verschiedenen Browsern (und Computern) überprüfen und die Site als solche verwenden

Meir Elad
quelle
2

Wie ich weiß, können Sie den Unterschied (oder die anderen Funktionen von Array) wie Code1 und Code2 finden. Zeigen Sie Array und seine Instanzen :

Code1:

[].slice; // find slice here
var arr = new Array();
arr.slice // find slice here
Array.prototype.slice // find slice here

Code2:

[].__proto__ == Array.prototype; // true
var arr = new Array();
arr.__proto__ == Array.prototype; // true

Fazit:

Wie Sie sehen []und new Array()eine neue Instanz von Array erstellen können. Und alle erhalten die Prototypfunktionen vonArray.prototype

Sie sind nur verschiedene Instanzen von Array. Dies erklärt, warum [] != []

:) :)

sammy
quelle
2

Ich habe mit [] ein seltsames Verhalten festgestellt.

Wir haben Modell "Klassen" mit Feldern, die auf einen bestimmten Wert initialisiert wurden. Z.B:

require([
  "dojo/_base/declare",
  "dijit/_WidgetBase",
], function(declare, parser, ready, _WidgetBase){

   declare("MyWidget", [_WidgetBase], {
     field1: [],
     field2: "",
     function1: function(),
     function2: function()
   });    
});

Ich habe festgestellt, dass die Felder, wenn sie mit initialisiert []werden, von allen Modellobjekten gemeinsam genutzt werden. Das Vornehmen von Änderungen wirkt sich auf alle anderen aus.

Dies geschieht nicht, wenn sie mit initialisiert werden new Array(). Gleiches gilt für die Initialisierung von Objekten ( {}vs new Object())

TBH Ich bin mir nicht sicher, ob es ein Problem mit dem von uns verwendeten Framework ist ( Dojo ).

Algiogia
quelle
2

Das ist mehr als man denkt. Die meisten anderen Antworten sind richtig, ABER AUCH ..

new Array(n)

  • Ermöglicht der Engine, Platz für nElemente neu zuzuweisen
  • Optimiert für die Array- Erstellung
  • Das erstellte Array ist als spärlich markiert und weist die am wenigsten leistungsfähigen Array-Operationen auf. Dies liegt daran, dass jeder Indexzugriff Grenzen überprüfen, prüfen muss, ob ein Wert vorhanden ist, und die Prototypkette durchlaufen muss
  • Wenn das Array als spärlich markiert ist, gibt es keinen Weg zurück (zumindest in V8). Es ist während seiner Lebensdauer immer langsamer, auch wenn Sie es 1 ms oder 2 Stunden später mit Inhalten füllen (gepacktes Array), spielt keine Rolle

[1, 2, 3] || []

  • Erstellt Array markiert ist verpackt (es sei denn , Sie verwenden deleteoder [1,,3]Syntax)
  • Optimiert für Array - Operationen ( for .., forEach, map, usw.)
  • Die Engine muss den Speicherplatz neu zuweisen, wenn das Array wächst

Dies ist wahrscheinlich bei älteren Browserversionen / Browsern nicht der Fall.

Solo
quelle
-2

Ich habe einen Unterschied zwischen den beiden Konstruktionen gefunden, der mich ziemlich hart gebissen hat.

Nehmen wir an, ich habe:

function MyClass(){
  this.property1=[];
  this.property2=new Array();
};
var MyObject1=new MyClass();
var MyObject2=new MyClass();

Wenn ich das im wirklichen Leben mache:

MyObject1.property1.push('a');
MyObject1.property2.push('b');
MyObject2.property1.push('c');
MyObject2.property2.push('d');

Am Ende habe ich Folgendes:

MyObject1.property1=['a','c']
MyObject1.property2=['b']
MyObject2.property1=['a','c']
MyObject2.property2=['d']

Ich weiß nicht, was in der Sprachspezifikation angegeben ist, aber wenn ich möchte, dass meine beiden Objekte eindeutige Eigenschaftsarrays in meinen Objekten haben, muss ich verwenden new Array().

Bucky
quelle
Diese JSFiddle zeigt, dass die Ausgabe dem Array-Literal []und dem new Array()Konstruktor entspricht, was zu einem Element pro Array und Eigenschaft führt. Sie müssen etwas anderes in Ihrem Code haben, um das oben gezeigte Ergebnis zu erhalten.
Gfullam
Bucky, das passiert mir in keinem Browser. Um dieses Verhalten zu erreichen, müssten Sie Folgendes tun: var property1static=[]; function MyClass(){ this.property1=property1static; this.property2=new Array(); };
Dave Burton
-3

Mit dem Array-Konstruktor wird ein neues Array mit der gewünschten Länge erstellt und jeder der Indizes mit undefiniert gefüllt. Das einer Variablen zugewiesene Array erstellt die Indizes, für die Sie ihm Informationen geben.

Timothy Trousdale
quelle
1
Nein, das Array ist NICHT gefüllt, es sind keine Indizes / Schlüssel enthalten. Zum Beispiel würde .forEach nicht funktionieren.
CFrei