Was ist der wahre Unterschied zwischen der Deklaration eines Arrays wie folgt:
var myArray = new Array();
und
var myArray = [];
javascript
arrays
declaration
Amr Elgarhy
quelle
quelle
[]
Token :ARRAY_INIT
;new Array
Token :NEW, IDENTIFIER
;new Array()
Token:NEW, IDENTIFIER, CALL
Antworten:
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:So veranschaulichen Sie die verschiedenen Möglichkeiten zum Erstellen eines Arrays:
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)
werdenundefined
dem Array nicht fünf Elemente hinzugefügt . Es wird einfach Platz für fünf Elemente hinzugefügt. Beachten Sie, dass es aufArray
diese Weise schwierig ist, sich aufarray.length
Berechnungen zu verlassen .quelle
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
Sie weisen den Interpreter an, ein neues Laufzeitarray zu erstellen. Keine zusätzliche Verarbeitung erforderlich. Erledigt.
Wenn du benutzt:
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:
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.
push
wo das andere nicht.Während Sie dies erwarten können, zeigt es nur die Tatsache, dass dies
[]
nicht dasselbe ist wienew 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 ...quelle
Es gibt einen wichtigen Unterschied, den noch keine Antwort erwähnt hat.
Davon:
Du denkst vielleicht, das
new Array(2)
ist gleichbedeutend mit[undefined, undefined]
, aber es ist NICHT!Versuchen wir es mit
map()
: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 Eigenschaftlength
auf das Argument festgelegt ist,len
und 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 undHasProperty
dann den Rückruf aufrufen, aber es stellt sich heraus, dass:Und deshalb können Sie keine iterierenden Funktionen erwarten, die wie gewohnt auf Arrays funktionieren, die aus erstellt wurden
new Array(len)
.Übrigens haben Safari und Firefox ein viel besseres "Drucken" für diese Situation:
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:
quelle
[...Array(2)]
das ich keine dokumentierten Referenzen finden kann. Dies entspricht dem[undefined, undefined]
Standpunkt der Ergebnisse.undefined
wie gewohnt.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.quelle
new Array(length)
auf 0 <= Größe <= ~ 1000, auf Größe> ~ 1000 gewinnt[]
Weitere Informationen finden Sie auf der folgenden Seite , warum Sie diese niemals verwenden müssen
new Array()
Lesen Sie auch die Kommentare - das
new Array(length)
Formular erfüllt keinen nützlichen Zweck (zumindest in den heutigen Implementierungen von JavaScript).quelle
Zum besseren Verständnis
[]
undnew Array()
:Das obige Ergebnis stammt von der Google Chrome-Konsole unter Windows 7.
quelle
Array(3)
odernew Array(3)
nicht[3]
.Der erste ist der Standardaufruf des Objektkonstruktors. Sie können die Parameter verwenden, wenn Sie möchten.
Mit dem zweiten können Sie ein nicht leeres Array erstellen:
quelle
var array = [5]
die eckigen Klammern verwenden, aber nicht den Konstruktor, davar array = Array(5)
ein leeres Array mit 5 Elementen erstellt wird.Ich kann es anhand dieses Beispiels, das auf Fredriks gutem basiert, genauer erklären.
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
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.
quelle
[]
undnew Array()
ist identisch;.value
wirdundefined
in beiden Fällen sein, und ein Vergleich wird immer falsch sein.array.value
. und beidestypeof []
undtypeof new Array()
zurückobject
.Array.isArray
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 gesetztvar 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.
vs.
quelle
Der erste ist der Standardaufruf des Objektkonstruktors, der hauptsächlich für dynamische Werte verwendet wird.
Das zweite Array wird beim Erstellen statischer Werte verwendet
quelle
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:
und
Gleichzeitig wird das Erstellen eines neuen Arrays mithilfe der
new Array
Syntax als schlechte Vorgehensweise angesehen: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.quelle
new Array(40).fill(123)
Der Unterschied bei der Verwendung
Oder
Wie in dieser Frage genug diskutiert.
Ich möchte das Geschwindigkeitsproblem hinzufügen - der derzeit schnellste Weg
google chrome
ist 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 anprobierenmozilla 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
quelle
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:
Code2:
Fazit:
Wie Sie sehen
[]
undnew 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
[] != []
:) :)
quelle
Ich habe mit [] ein seltsames Verhalten festgestellt.
Wir haben Modell "Klassen" mit Feldern, die auf einen bestimmten Wert initialisiert wurden. Z.B:
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 newObject()
)TBH Ich bin mir nicht sicher, ob es ein Problem mit dem von uns verwendeten Framework ist ( Dojo ).
quelle
Das ist mehr als man denkt. Die meisten anderen Antworten sind richtig, ABER AUCH ..
new Array(n)
n
Elemente neu zuzuweisen[1, 2, 3] || []
delete
oder[1,,3]
Syntax)for ..
,forEach
,map
, usw.)quelle
Ich habe einen Unterschied zwischen den beiden Konstruktionen gefunden, der mich ziemlich hart gebissen hat.
Nehmen wir an, ich habe:
Wenn ich das im wirklichen Leben mache:
Am Ende habe ich Folgendes:
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()
.quelle
[]
und demnew 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.var property1static=[];
function MyClass(){ this.property1=property1static; this.property2=new Array(); };
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.
quelle