29

検討:

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]
4

5 に答える 5

24

配列コンストラクターは、指定された長さの配列を作成します。キーは作成されません。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) {目は、存在しないキーがコールバック関数によって処理されないことを示しています。

于 2012-06-29T17:20:41.300 に答える
6

MDNから:

コールバックは、値が割り当てられている配列のインデックスに対してのみ呼び出されます。削除されたインデックス、または値が割り当てられたことがないインデックスに対しては呼び出されません。

配列についてはa、長さ3の配列をインスタンス化しましたが、値を割り当てていません。map関数は、値が割り当てられた要素を検出しないため、新しい配列を生成しません。

配列bの場合、それぞれが値を持つ3つの要素の配列をインスタンス化しましたundefined。map関数は、値が割り当てられた3つの要素を検索し、新しい配列内の各要素の新しい値として「0」を返します。

于 2012-06-29T17:24:33.817 に答える
5

map空のインデックスではなく、既存のプロパティのみを反復します。

したがって、それを機能させたい場合は、最初に配列を埋める必要があります。

これには複数の方法があります。たとえば、次のとおりです。

于 2016-07-23T03:44:35.717 に答える
4

aは要素を持たない空の配列であるため、map関数は要素のない空の配列を生成します(仕様により、mapは[[HasProperty]]がtrueの場合にのみ結果を生成します)。 bは3つの要素の配列であるため、mapは次の配列を生成します。 3つの要素。

于 2012-06-29T17:21:41.040 に答える