2016-01-10 21 views
7

Ich möchte ein leeres Array mit fester Länge erstellen und dann darauf verwenden, um ein neues Array zurückzugeben. Es funktioniert jedoch nicht wie erwartet.Array-Konstruktor funktioniert nicht wie erwartet

Nach mdn docs:

Wenn das einzige Argument für den Konstruktor übergeben Array eine ganze Zahl zwischen 0 und 232-1 (einschließlich), gibt diese ein neues JavaScript-Array mit der Länge auf diese Zahl gesetzt.

new Array(3) kehrt [undefined × 3]. Sollte es nicht sein: [undefined, undefined, undefined]?

Lassen Sie uns folgende Beispiele betrachten:

1) Problem.

var a = new Array(3); 
a.map((x, i) => i); // [undefined × 3] 

2) Arbeiten.

var a = Array.apply(null, new Array(3)); 
a.map((x, i) => i); // [0, 1, 2] 

Ich habe dies auf der neuesten Google Chrome Canary getestet.

+0

Ok, ich dachte zuerst das war Wahnsinn, aber ich kann Chrome 47.0.2526.106 m Ausgänge '[undefined × 3]' – Jonathan

+1

'Array [<3 leere Steckplätze>]' in Firefox bestätigen. Je mehr du weisst. –

+2

'neues Array (3)' erstellt kein Array mit Elementen, es ist nur ein Dummy – CoderPi

Antwort

3

Vom MDN: this returns a new JavaScript array with length set to that number

Der von new Array(n) erstellt Array hat keine Elemente, nur eine Länge. Aus diesem Grund können Sie die (nicht vorhandenen) Elemente nicht zuordnen.

+0

[undefined, undefined, undefined] .map (Funktion (x, i) {return i}) gibt [0,1,2] zurück - in diesem Fall ist jeder Wert undefiniert. Das vom neuen Array (3) aufgerufene Array hat keine Werte – CoderPi

+0

@torazaburo nicht wirklich 'neues Array (3) [0]' gibt 'undefiniert' zurück, weil das Element keinen Wert hat, aber intern nicht den Wert 'undefiniert' hat Es existiert einfach nicht. In einigen Fällen wird es so aussehen, als hätte es Werte wie undefined, aber es hat keine Elemente – CoderPi

+0

@torazaburo und wie könnte es nicht vorhandene Elemente überspringen, wenn sie nicht existieren. Aber ich bekomme dich, gute Ergänzung, wenn jemand den Punkt bekommt ^^ – CoderPi

0

Ein Beispiel in einem neben CodeiSirs beantworten:

// foo and bar are identical. They are arrays with length 3 and no indices. 
 
var foo = new Array(3); 
 
var bar = []; 
 
bar.length = 3; 
 

 
console.log(foo); 
 
console.log(bar); 
 

 
// This is different. It has 3 indices with the value undefined. 
 
var pez = [undefined, undefined, undefined]; 
 
console.log(pez);

Die Konsole zeigt new Array(3) irgendwie komisch, weil es als [undefined, undefined, undefined]

1

map überspringt undefinierte Elemente nicht die selbe ist, von Entwurf.

Vom documentation:

callback ist nur für Indizes des Arrays aufgerufen, die Werte zugewiesen haben

Es gibt viele Fragen hier auf SO mit Bezug zu diesem Thema und bietet Möglichkeiten zum Erstellen Arrays, die zugeordnet sind, werden auf allen Elementen von, wie

nur o arbeiten Ein Beispiel hierfür ist die neue Füllmethode "Array #".

+0

Es gibt einen Unterschied zwischen Indizes, die einen Wert von undefinierten undefinierten Indizes haben ... – Jonathan

+0

Ja, guter Punkt. 'map' überspringt das letztere, aber auch das erstere nicht, wie in der Dokumentation, die" Indizes des Arrays, denen Werte zugewiesen wurden, einschließlich undefiniert ", deutlich gemacht wird. Das ist eigentlich der Grund, warum 'fill' funktioniert. Er weist jedem Element den Wert undefined zu. –

+0

Ich glaube nicht, dass Ihr Kommentar zu OP korrekt ist, '[undefined × 3]' ist nicht '[undefined, undefined, undefined]'. Die erste Notation scheint zu zeigen, dass die Indizes nicht definiert sind. – Jonathan

Verwandte Themen