Was ist der Unterschied zwischen „Array ()“ und „[]“, während einer JavaScript-Array deklarieren?
-
06-09-2019 - |
Frage
Was ist der Unterschied ein Array wie folgt zwischen deklarieren:
var myArray = new Array();
und
var myArray = [];
Lösung
Es gibt einen Unterschied, aber es gibt keinen Unterschied in diesem Beispiel.
Mit der ausführlicheren Methode: new Array()
hat eine zusätzliche Option in den Parametern: Wenn Sie eine Nummer an den Konstruktor übergeben, werden Sie eine Reihe von dieser Länge bekommen:
x = new Array(5);
alert(x.length); // 5
Um die verschiedenen Möglichkeiten zu zeigen, um ein Array zu erstellen:
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 ist, dass, wenn new Array()
verwenden Sie die Größe des Arrays zu setzen sind in der Lage, die die Stapelgröße beeinflusst. Dies kann nützlich sein, wenn Sie bekommen Stapel überläuft ( Leistung von Array.push vs Array.unshift ), das ist, was passiert, wenn die Größe des Arrays übersteigt die Größe des Stapels, und es muss neu erstellt werden. So kann es tatsächlich, je nach Anwendungsfall, eine Leistungssteigerung, wenn new Array()
verwenden, weil Sie den Überlauf passiert verhindern können.
Wie in diese Antwort darauf hingewiesen, new Array(5)
wird nicht wirklich fünf undefined
Elemente zum Array hinzufügen. Es fügt einfach Platz für fünf Elemente. Beachten Sie, dass mit Array
auf diese Weise macht es schwierig, auf array.length
für Berechnungen zu verlassen.
Andere Tipps
Der Unterschied zwischen einer Anordnung mit dem impliziten Array zu schaffen und dem Array-Konstruktor ist subtil, aber wichtig.
Wenn Sie ein Array erstellen mit
var a = [];
Sie sagen den Interpreter einen neuen Runtime-Array zu erstellen. Keine zusätzliche Bearbeitung überhaupt notwendig ist. Fertig.
Wenn Sie:
var a = new Array();
Sie sagen den Interpreter, ich möchte den Konstruktor „Array
“ nennen und ein Objekt zu erzeugen. Es sieht dann durch Ihren Ausführungskontext auf den Konstruktor finden zu nennen, und es nennt, Ihr Array erstellen.
Sie mögen denken: „Nun, dies nicht egal. Sie sind gleich!“. Leider kann man 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 wird der erste Anruf ‚SPARTA‘ aufmerksam machen, wie man es erwarten würde. Die zweite nicht. Sie werden am Sehen undefined beenden. Sie werden bemerken auch, dass b enthält alle nativen Array-Objekt Funktionen wie push
, wo der andere nicht.
Während man erwarten kann dies geschehen kann, es zeigt nur die Tatsache, dass []
als new Array()
nicht gleich ist.
Es ist wahrscheinlich am besten nur []
verwenden, wenn Sie wissen, dass Sie nur ein Array wollen. Ich glaube nicht, auch vorschlagen, gehen um und neu zu definieren Array ...
Es gibt einen großen Unterschied, dass niemand erwähnt.
Man könnte denken, die new Array(2)
zu [undefined, undefined]
entspricht vor, weil wir haben
new Array(2).length // 2
new Array(2)[0] === undefined // true
new Array(2)[1] === undefined // true
aber es ist nicht!
Lassen Sie uns versuchen map()
:
[undefined, undefined].map(e => 1) // [1, 1]
new Array(2).map(e => 1) // "(2) [undefined × 2]" in Chrome
Sehen Sie? Es ist anders! Aber warum ist das denn?
Nach ES6 Spec 22.1.1.2, Array(len)
schafft nur ein neues Array mit length
mehr len
und nichts festgelegt. Somit gibt es kein wirkliches Element innerhalb des neuen Arrays.
Während Funktion map()
nach 22.1.3.15 spec würde zunächst prüfen HasProperty
dann den Rückruf nennen, aber es stellt sich heraus, dass:
new Array(2).hasOwnProperty(0) // false
[undefined, undefined].hasOwnProperty(0) // true
Das ist, warum Sie keine Iterationsfunktionen wie gewohnt erwarten können von new Array(len)
erstellt Array arbeiten .
BTW, Safari und Firefox haben einen viel besseren Ausdruck folgt aus:
// 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 bereits vorgelegt ein Problem zu Chrome, sie zu bitten, dieses verwirrende Protokoll zu beheben: https://bugs.chromium.org/p/chromium/issues/detail ? id = 732021
UPDATE: Es ist bereits festgelegt. Chrome einzuloggen nun als
new Array(2) // (2) [empty × 2]
Merkwürdigerweise new Array(size)
ist fast 2x schneller als in []
Chrom, und etwa das gleiche in FF und IE (gemessen durch das Erstellen und Füllen einen Array). Wichtig ist nur, wenn Sie die ungefähre Größe des Arrays kennen. Wenn Sie mehr Einzelteile als die Länge addieren Sie gegeben haben, wird die Leistungssteigerung verloren.
Genauer:. Array(
ist ein schneller konstanter Zeitbetrieb, die keinen Speicher reserviert, wheras []
ist ein linearer Zeitbetrieb, die Art und Wert legt
Weitere Informationen folgende Seite: beschreibt, warum Sie nie new Array()
verwenden müssen
Sie müssen nie
new Object()
verwenden, in JavaScript. Verwenden Sie das Objektliteral{}
stattdessen. In ähnlicher Weise verwenden nichtnew Array()
, verwenden, um den Arrayliteral[]
stattdessen. Arrays in JavaScript Arbeit nichts, wie die Arrays in Java, und Verwendung der Java-ähnliche Syntax wird Verwechseln Sie.Verwenden Sie keine
new Number
,new String
odernew Boolean
. Diese Formen produzieren unnötiger Objekt-Wrapper. Benutz einfach einfache Literale statt.
auch die Kommentare Check-out - die new Array(length)
Form keinen nützlichen Zweck (die zumindest in der heutigen Implementierungen von JavaScript) ausgeschenkt wird
Um []
und new Array()
besser zu verstehen:
> []
[]
> 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 ist von Google Chrome-Konsole auf Windows 7.
Die erste ist das Standardobjekt Konstruktoraufruf. Sie können es Parameter verwenden, wenn Sie möchten.
var array = new Array(5); //initialize with default length 5
Die zweite gibt Ihnen die Möglichkeit nicht leeres Array zu erstellen:
var array = [1, 2, 3]; // this array will contain numbers 1, 2, 3.
Ich kann in einer spezifischeren Weise erklären mit diesem Beispiel beginnen, die auf Fredriks gut basiert.
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);
Habe ich nur noch einen anderen Wert zu dem Arrays und machte vier Warnungen: Die erste und zweite sind uns der Wert in jedem Array gespeichert zu geben, über die Werte sicher sein. Sie werden das gleiche wieder! Nun versuchen, das dritte, es gibt false zurück, das ist, weil
JS behandelt Test1 als Variable mit dem Datentyp array und behandelt Test2 als Objekt mit der Funktionalität eines Arrays , und es gibt nur wenige geringfügige Unterschiede hier.
Der erste Unterschied ist, wenn wir nennen Test1 es eine Variable, ohne zu denken nennt, gibt es nur die Werte, das in diesen Variablen gespeichert ist, dessen Datentyp abgesehen! Aber, wenn wir nennen test2 es ruft die Array () Funktion und speichert es dann unsere "Pushed" Werte in seiner "Wert" Eigenschaft, und das gleiche passiert, wenn wir test2 alarmieren, es gibt die „Wert“ Eigenschaft des Array-Objekt.
Wenn wir also prüfen, ob test1 test2 natürlich gleich werden sie nie true zurück, ist eine Funktion und das andere ist eine Variable (mit einem Array-Typ), auch wenn sie den gleichen Wert haben!
über das Um sicher zu gehen, versuchen, den 4. Alarm, mit der .value ihm hinzugefügt; es wird true zurück. In diesem Fall sagen wir JS „die Art des Behälters Ohne Berücksichtigung, ob es sich um Funktion oder Variable, vergleichen Sie bitte die Werte, die in jedem Behälter gespeichert sind, und sagen Sie uns, was Sie gesehen haben!“ das ist genau das, was passiert.
Ich hoffe, ich sagte, die Idee dahinter klar, und sorry für mein schlechtes Englisch.
Es gibt keinen Unterschied, wenn Sie Array ohne Länge initialisieren. So var a = []
& var b = new Array()
ist gleich.
Aber wenn Sie Array mit Länge wie var b = new Array(1);
initialisieren, wird es Array-Objekt Länge bis 1. So sein entspricht var b = []; b.length=1;
gesetzt.
Diese problematisch sein wird, wenn Sie array_object.push, es hinzufügen Produkt nach dem letzten Element & Erhöhung der Länge.
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
Der erste ist der Standard Objektkonstruktor call.mostly für dynamische Werte verwendet.
var array = new Array(length); //initialize with default length
das zweite Array wird verwendet, wenn statische Werte Erstellung
var array = [red, green, blue, yellow, white]; // this array will contain values.
Es gibt keinen großen Unterschied, sie tun im Grunde das Gleiche, aber sie auf unterschiedliche Weise tun, aber lesen Sie weiter, schauen Sie sich diese Aussage auf W3C:
var cars = ["Saab", "Volvo","BMW"];
und
var cars = new Array("Saab", "Volvo", "BMW");
Die beiden Beispiele oben genau das gleiche tun. Es besteht keine Notwendigkeit zu verwenden, new Array ().
Zur Vereinfachung der Lesbarkeit und Ausführungsgeschwindigkeit, verwenden Sie die erste (die Arrayliteral Methode).
Aber zur gleichen Zeit, neue Array erstellen new Array
Syntax als schlechte Praxis betrachtet:
Vermeiden new Array ()
Es gibt keine Notwendigkeit, die JavaScript-internen Array-Konstruktor zu verwenden new Array ().
Verwenden Sie [] statt.
Diese beiden unterschiedlichen Aussagen schaffen beide ein neues leeres Array mit dem Namen Punkte:
var points = new Array(); // Bad
var points = []; // Good
Diese beiden unterschiedlichen Aussagen beide erstellen Sie 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 erschwert nur den Code. Es kann auch einige produzieren unerwartete Ergebnisse:
var points = new Array(40, 100); // Creates an array with two elements (40 and 100)
Was passiert, wenn ich eines der Elemente entfernen?
var points = new Array(40); // Creates an array with 40 undefined elements !!!!!
Also im Grunde nicht als die beste Praxis betrachtet, auch gibt es einen kleinen Unterschied gibt, Sie Länge passieren können, so new Array(length)
, die auch nicht einen empfohlene Weg.
Der Unterschied der Verwendung von
var arr = new Array(size);
oder
arr = [];
arr.length = size;
Wie in dieser Frage diskutiert genug ist.
Ich möchte die Geschwindigkeit Problem hinzufügen -. Die Strom schnellste Weg, auf google chrome
die zweite ist
Aber darauf achten, diese Dinge sind in der Regel viel mit Updates ändern. Auch die Laufzeit zwischen verschiedenen Browsern unterscheiden.
Zum Beispiel -. Die zweite Option, die ich erwähnte, bei läuft 2.000.000 [ops / s] auf chrome
, aber wenn man es auf mozilla dev.
versuchen würde Sie eine überraschend höhere Rate von 23 Millionen bekommen
Wie auch immer, ich würde vorschlagen, dass Sie es ausprobieren, jeder einmal in einer Weile, auf verschiedenen Browsern (und Maschinen), mit Website als solche
Wie ich kenne die diference u die Scheibe finden (oder die anderen funcitons von Array) wie code1 .und code2 show u 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:
als u sehen []
und new Array()
eine neue Instanz von Array.And schaffen sie alle Prototyp Funktionen von Array.prototype
bekommen
Sie sind nur andere Instanz Array.so dies erklären, warum
[] != []
:)
Ich habe in einem seltsamen Verhalten entstehen, mit [].
Wir haben Modell „Klassen“ mit Feldern bis zu einem gewissen Wert initialisiert. Z. B .:
require([
"dojo/_base/declare",
"dijit/_WidgetBase",
], function(declare, parser, ready, _WidgetBase){
declare("MyWidget", [_WidgetBase], {
field1: [],
field2: "",
function1: function(),
function2: function()
});
});
Ich fand, dass, wenn die Felder mit []
initialisiert werden, dann wäre es von allen Modellobjekten geteilt werden. Änderungen an einem zu machen wirkt sich auf alle anderen.
Dies geschieht nicht, sie mit new Array()
initialisiert. Das Gleiche gilt für die Initialisierung von Objekten ({}
vs neuem Object()
)
TBH bin ich nicht sicher, ob es ein Problem mit dem Rahmen, den wir wurden mit ( Dojo )
Ich habe einen Unterschied zwischen den beiden Konstruktionen gefunden, die mir ziemlich schwer gebissen.
Lassen Sie uns sagen, ich habe:
function MyClass(){
this.property1=[];
this.property2=new Array();
};
var MyObject1=new MyClass();
var MyObject2=new MyClass();
Im wirklichen Leben, wenn ich dies tun:
MyObject1.property1.push('a');
MyObject1.property2.push('b');
MyObject2.property1.push('c');
MyObject2.property2.push('d');
Was ich am Ende mit, ist dies:
MyObject1.property1=['a','c']
MyObject1.property2=['b']
MyObject2.property1=['a','c']
MyObject2.property2=['d']
Ich weiß nicht, was die Sprachspezifikation sagt geschehen soll, aber wenn ich meine zwei Objekte will in meinen Objekten einzigartige Eigenschaft Arrays haben, ich habe new Array()
verwenden.
, um den Array-Konstruktor ein neues Array der gewünschten Länge macht und jeder der Indizes mit undefinierten auffüllt, die ein Array an eine Variable eine zugeordnet erstellt die Indizes, die Sie es Informationen geben für.