Was ist der Unterschied zwischen „Array ()“ und „[]“, während einer JavaScript-Array deklarieren?

StackOverflow https://stackoverflow.com/questions/931872

  •  06-09-2019
  •  | 
  •  

Frage

Was ist der Unterschied ein Array wie folgt zwischen deklarieren:

var myArray = new Array();

und

var myArray = [];
War es hilfreich?

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 nicht new 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 oder   new 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top