0

Array.prototype.mapArray インスタンスを直接呼び出すoと、「変更されていない」配列になるのはなぜですか?

var o = Array(3); // [ undefined, undefined, undefined ]
o.map((x,y) => y*2); //  [ undefined, undefined, undefined ]

代わりに、適用 (または呼び出し) を使用する必要があります。

Array.apply(0, o).map((x, y) => y*2)); // [ 0, 2, 4 ]

私は何が欠けていますか?

最後に、上記の代替手段は次のとおりです。

[...o].map((x, y) => y*2); // [ 0, 2, 4]

これは、元の実装に欠けているものをすべて修正するためだと思います。

4

1 に答える 1

4

Array インスタンス o で Array.prototype.map を直接呼び出すと、「変更されていない」配列になるのはなぜですか?

.map実際に存在する要素に対してのみ機能するためです。length の空の配列をArray(3)作成します。別の言い方をすれば、穴を省略します。3.map

代わりに、apply (または call) を使用する必要があります: ... 何が足りないのでしょうか?

Array.apply(0, o)あなたの場合と同等Array(undefined, undefined, undefined)です。つまり、3 つの要素を含む配列を作成しています。

比べてみると違いがよくわかる

console.dir(Array(3));
// vs
console.dir(Array.apply(null, Array(3)));

最初のものにはプロパティのみがありlength、2 番目のものにはプロパティ0と が1あり2ます。

最後に、上記の代替手段は次のとおりです。 ...

スプレッド オペレータは を呼び出しますo[Symbol.iterator]for配列の反復子は、通常のループを使用するときと同じように、穴を反復します。

于 2015-04-15T21:07:08.660 に答える