Nach den MDN documentation for new Array(length)
kann ich ein Array mit einer bestimmten Länge als solche initialisieren:Ist ein neues JavaScript-Array mit der Länge unbrauchbar?
var a = new Array(10);
a.length; // => 10
a; // => [undefined x 10]
jedoch anscheinend kann ich nicht Methoden wie map(...)
auf das neue Array, auch wenn auf andere Weise konstruiert Arrays arbeitet fein:
a.map(function() { return Math.random(); });
// => [undefined x 10] -- wtf?
[undefined, undefined].map(function() { return Math.random(); });
// => [0.07192076672799885, 0.8052175589837134]
Warum ist das der Fall?
Ich verstehe, aus dieser Erfahrung (und das Suchen im Internet), dass der Array-Konstruktor mit Länge ein schwarzes Loch von unerklärlichem Verhalten ist, aber nicht die ECMA 262-Spezifikation bietet eine Erklärung?
Ich vermute, dass '[undefined x 10]' ist nur eine Darstellung in Ihrer Konsole, dass Sie sagt habe ein leeres 10-dimensionales Array. In Firefox heißt es nur 'Array [<10 leere Slots>]'. – mc10
FWIW '[undefiniert, undefiniert] .map (function() {return Math.random();});' führt keine Operationen mit den undefinierten Elementen aus, weshalb diese Gleitkommazahlen zurückgegeben werden. [Wenn Sie sie als Parameter an den Callback übergeben und versucht haben, ihn zu verwenden, würde 'map' fehlschlagen.] (Http://jsfiddle.net/bdwm4714/). [Die map-Spezifikation sagt] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) "Es wird nicht für Indizes aufgerufen, die undefiniert sind gelöscht wurden oder denen noch nie Werte zugewiesen wurden. " – Andy
@Andy: Ich weiß nicht, dieses Snippet verhält sich wie erwartet -> '[undefined] .map (Funktion (x) {zurück" OK: "+ x;}) // => [" OK: undefined "]'. Vielleicht ist das der Unterschied zwischen "undefinierten Werten" und "[Indizes], denen nie Werte zugewiesen wurden. – maerics