検討:
var a = Array(3);
var b = [undefined,undefined,undefined];
とが異なる結果a.map
を生成する理由は何ですか?b.map
a.map(function(){ return 0; }); //produces -> [undefined,undefined,undefined]
b.map(function(){ return 0; }); //produces -> [0,0,0]
検討:
var a = Array(3);
var b = [undefined,undefined,undefined];
とが異なる結果a.map
を生成する理由は何ですか?b.map
a.map(function(){ return 0; }); //produces -> [undefined,undefined,undefined]
b.map(function(){ return 0; }); //produces -> [0,0,0]
配列コンストラクターは、指定された長さの配列を作成します。キーは作成されません。Array.prototype.map
のコールバック関数は、リスト内の要素に対してのみ実行されます。
つまり、キー(整数)0≤i<長さに関連付けられているすべての値。
Array(3)
キーがゼロであるため、.map
のコールバックがトリガーされることはありません。[void 0, void 0, void 0]
には3つのキーがあり、コールバック関数が実行されます。
Array(3).hasOwnProperty(0); // false
[void 0, void 0, void 0].hasOwnProperty(0); // true
仕様とそのポリフィルはMDNで言及されています。47行if (k in O) {
目は、存在しないキーがコールバック関数によって処理されないことを示しています。
MDNから:
コールバックは、値が割り当てられている配列のインデックスに対してのみ呼び出されます。削除されたインデックス、または値が割り当てられたことがないインデックスに対しては呼び出されません。
配列についてはa
、長さ3の配列をインスタンス化しましたが、値を割り当てていません。map関数は、値が割り当てられた要素を検出しないため、新しい配列を生成しません。
配列b
の場合、それぞれが値を持つ3つの要素の配列をインスタンス化しましたundefined
。map関数は、値が割り当てられた3つの要素を検索し、新しい配列内の各要素の新しい値として「0」を返します。
map
空のインデックスではなく、既存のプロパティのみを反復します。
したがって、それを機能させたい場合は、最初に配列を埋める必要があります。
これには複数の方法があります。たとえば、次のとおりです。
.fill()
、ES6で導入
console.log(new Array(3).fill().map(function(){ return 0; }));
var arr = [].concat.apply([], new Array(3));
console.log(arr.map(function(){ return 0; }));
古いfor
ループ。
var arr = new Array(3);
for(var i=0; i<arr.length; ++i) arr[i] = 1; /* whatever */
console.log(arr.map(function(){ return 0; }));
ゼロで埋められた JavaScript 配列を作成するための最も効率的な方法からいくつかのアイデアを使用しますか?
など。
a
は要素を持たない空の配列であるため、map関数は要素のない空の配列を生成します(仕様により、mapは[[HasProperty]]がtrueの場合にのみ結果を生成します)。 b
は3つの要素の配列であるため、mapは次の配列を生成します。 3つの要素。