2017-12-28 3 views
2

Kann mir jemand den Unterschied zwischen new Array(7) und Array.apply(null, Array(7)) erklären? Im Kontext:Unterschied zwischen neuen Array (7) und Array.apply (null, Array (7))

Array.apply(null, Array(7)).map((e, i) => { 
 
    return moment(i, 'e').format('ddd'); 
 
}); // ["Sun" ,"Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] 
 

 
new Array(7).map((e, i) => { 
 
    return moment(i, 'e').format('dd'); 
 
}); // [empty × 7]
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment-with-locales.min.js"></script>

+0

Ich erhalte eine Fehlermeldung, wenn die Codes ausgeführt wird. '" TypeError: (neues Array (...)). Apply ist keine Funktion ",' – user184994

+0

@ user184994, bearbeitet –

+1

Mögliche Duplikate von [JavaScript "new Array (n)" und "Array.prototype.map" Seltsamkeit] (https: // Stapelüberlauf.com/questions/5501581/javascript-new-array-und-array-prototype-map-seltsamkeit – user184994

Antwort

3
Array(7) 

erstellt ein Sparse-Array ohne Elemente. So wie ein Objekt würde es aussehen wie:

{length: 7} 

Wenn Sie eines der neuen kühlen Array-Methoden aufrufen würde, würde es nicht wiederholen, da es keine Elemente in der Anordnung sind. Wenn jedoch, dass in den Array-Konstruktor verteilt:

Array(...Array(3)) 

Sein gleich

Array(undefined, undefined, undefined) 

Und das schafft tatsächlich 3 (oder 7) nicht definiert Array Slots:

{ 
0:undefined, 
1:undefined, 
2:undefined, 
length:3 
} 

Und jetzt Sie kann mit map usw. darüber iterieren. Dasselbe ist möglich mit:

Array(7).fill().map(func) 

und

Array.from({length:7}, func); 
1

diese beiden Ansätze sind gleichwertig, da Function.prototype.apply Teil des Function api ist.

es sieht Sie wahrscheinlich brauchen etwas wie:

Array 
    .from({ length: 7 }, (_, i) => moment(i, 'e').format('ddd')) 
; 
3

Array.apply ruft die Prototyp-Methode auf dem Array Objekt. Wo, wie tun Array(7) wird ein neues Array aus sieben Elementen zu schaffen, die als solche new Array(7).apply kein gültiger Anruf und würde den folgenden Fehler geben:

Uncaught TypeError: (intermediate value).apply is not a function

Doing Array.apply(null, Array(7)) die einzige gültige Anruf ist hier.

bearbeiten

Die Aussage Array.apply(null, Array(7)) wird ein Array mit undefined Elementen bestückt erstellen. Als solcher Aufruf .map() wird diese Elemente iterieren und Ihr erwartetes Ergebnis produzieren.

Auf der anderen Seite wird durch Aufruf von nur new Array(7) ein Sparse-Array mit einer Definitionslänge von 7 erstellt. Die Länge wird als 7 definiert, aber es wurden keine Elemente in das Array eingefügt. Es gibt also noch nichts, worüber ich noch sprechen könnte.

+0

Prototyp-Methode ist es wie statische Methode? –

+0

'Array' ist eine Funktion! –

Verwandte Themen