Auf der einen Seite ist ein Mangel an einem Äquivalent Python 3 range
ein Ärgernis in ES6. Auf der anderen Seite gibt es viele Problemumgehungen. Meine Frage ist, warum eine Workaround, die ich versuchte, tatsächlich funktioniert. Zur Veranschaulichung:Erstellen Sie eine Reihe von natürlichen Zahlen mit Spread-Syntax
[...Array(10).keys()];
Bei dem Grunde finde ich diese mysteriösen nicht offensichtlich ist, beachten Sie, dass Array(10).keys()
ist zumindest scheinbar leer.
Ich weiß, dass dies verschwenderisch zwei Arrays erstellt, wie die meisten der gängigen Workarounds, und das (auf Kosten der Erstellung einer Generatorfunktion) mit einem Generator kann dies vermeiden. Beispiel:
[...(function*(){let i = 0; while(i<10) yield i++;})()];
Meine Frage ist nur darüber, warum die erste Problemumgehung das gewünschte Ergebnis erzeugt.
Edit:
aus den Antworten zu urteilen, glauben einige Leute, dass die Bewertung der Array(10)
zur Bewertung von Array.apply(null,Array(10))
entspricht. Sie sind nicht. Zum Beispiel ist .hasOwnProperty(0)
false
für das erstere, aber true
für das letztere. Ich bin jedoch offen dafür, dass sie überzeugt sind, dass sie in gewisser Weise die gleichen sind, die hier von Bedeutung sind, da mein Verständnis in einem entscheidenden Punkt eindeutig fehlt. Ich vermute, dass die Antwort ist, dass das Ergebnis der Iteration über die Schlüssel durch die length
-Eigenschaft bestimmt wird, die beide teilen, anstatt die tatsächlichen Array-Indizes, die definiert wurden. Wenn ja, würde ich gerne wissen, dass dieses Verhalten normativ ist.
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/keys –
'.keys() 'gibt einen * Iterator * zurück. Es ist kein Array, es ist nicht "scheinbar leer". – Bergi
@Bergi Werfen Sie einen Blick darauf. Wie einige der Antworten scheinen Sie falsch zu verstehen, was von "Array (10)" erzeugt wird. (Oder vielleicht missverstehe ich deine Antwort.) – Alan