12 Stimmen

Ist Array(5) gleichbedeutend mit var a = []; a.length = 5; in JS?

Ich sehe vier fünf Optionen, um ein Array auf eine bestimmte Länge in JS zu initialisieren (die letzte Option ist etwas weit hergeholt, ich weiß):

var a = []; a.length = 5;

var a = Array(5);

var a = []; a[4] = undefined;

var a = new Array(5);

function makeArrayToLength(length, default){
    var a = [], i = 0;
    for(; i < length; i++){
        a[i] = default;
    }
    return a;
}

Ich möchte auf jeden Fall (und tun) verwenden Sie das Literal, wann immer möglich, aber ich bin in einer Situation, wo der definierende Aspekt eines bestimmten Arrays seine Länge ist, so dass ich in Richtung Array(5) lehnt. Ist das erste Beispiel gleichwertig mit dem zweiten in Bezug auf das Endergebnis? Ich weiß, dass es in der Ausführung nicht gleichwertig ist.

9voto

Christian C. Salvadó Punkte 763569

Die ersten beiden und das dritte Beispiel sind gleichwertig, sie ergeben am Ende eine Array Objekt mit nur einem eigenes Grundstück , length mit 5 als seinen Wert.

Wenn Sie die Array Konstruktor mit einem einzigen numerischen Argument (wie Array(5); ), enthält das neu erstellte Objekt diese Zahl als seine length Eigenschaft, die Index-Eigenschaften werden nicht erstellt:

var a = Array(5);
a.hasOwnProperty('0'); // false

Das zweite Beispiel ergibt genau dasselbe:

var a = [];
a.length = 5;
a.hasOwnProperty('0'); // false

Das dritte Beispiel ist nicht äquivalent, da es eine Eigenschaft auf dem Array-Objekt erstellt, obwohl der Wert undefined :

var a = []; a[4] = undefined;
a.hasOwnProperty('4'); // true

Das vierte Beispiel:

var a = new Array(5);

ist genau dasselbe wie die zweite ( var a = Array(5); ), gibt es keinen Unterschied zwischen der Verwendung der Array Konstruktor mit oder ohne die new Operator, im zweiten Beispiel sind Sie Aufruf der Array Konstruktor als Funktion .

Und schließlich, über Ihre makeArrayToLength Funktion ist, wie Sie sicher wissen, überhaupt nicht gleichwertig, da alle "Indexeigenschaften" auf einen "Standardwert" initialisiert werden. (Benutzen Sie übrigens nicht <code>default</code> als Bezeichner, es ist ein Schlüsselwort...)

En Array Konstruktor wird in der Regel vermieden, weil er sich je nach verwendetem Argument unterschiedlich verhalten kann, zum Beispiel:

Array("5"); // one element array, (["5"])
Array(5);   // empty array, length = 5
// v.s.
["5"]       // one element array
[5]         // one element array

Auch die Array Konstruktor kann überschrieben werden, während Array-Literale immer funktionieren werden.

2voto

Hamish Punkte 22042

Ja, sie führen alle zu demselben Ergebnis.

2 und 4 sind identisch, denn nach der ECMAScript-Spezifikation :

15.4.1 Der als Funktion aufgerufene Array-Konstruktor Wenn Array als Funktion aufgerufen wird Funktion und nicht als Konstruktor aufgerufen wird, erzeugt und initialisiert er ein neues Array Objekt. Daher ist der Funktionsaufruf Array(...) ist äquivalent zu dem Objekt Erzeugungsausdruck new Array(...) mit den gleichen Argumenten.

1 und 2 sind gleichwertig, weil [] konstruiert ein neues Array und das Setzen der Längeneigenschaft ist äquivalent zum Konstruieren eines Arrays mit new Array(length) ( in der Spezifikation ).

Option 3 ist ebenfalls gleichwertig, denn:

...jedes Mal, wenn eine Eigenschaft hinzugefügt wird, deren Name ein Array-Index ist, wird die Längeneigenschaft, falls erforderlich, so geändert, dass sie um eins größer ist als der numerische Wert dieses Array-Indexes

Und Option 5 ist im Grunde nur Option 3, aber mehrfach wiederholt bis zum maximalen Index.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X