2017-06-14 8 views
2

new Array(3)は、[undefined, undefined, undefined]に相当する3つのundefinedを含む長さ3の配列を返します。しかしながら新しい配列()のJavascriptマッピング

[undefined, undefined, undefined].map((val, i) => i)[0, 1, 2]の期待される結果を生成します。しかし、new Array(3).map((val, i) => i)は、マップ機能がまったく影響を及ぼさなかったかのように、[undefined, undefined, undefined]を生成します。

誰でも理由を説明できますか?

EDIT new Array()の私の理解に欠陥があるように見えます。新しい配列は作成されません。それは渡された引数と等しいキーlengthでオブジェクトを作成します。答えとコメントありがとう。

Btw [undefined, undefined, undefined]のような配列が必要な場合は、繰り返し/マップするか、何かの場合は[...new Array(m)]がすべきです。

+3

*と同等である3 undefinedsを含む[未定義、未定義、未定義]; *それは間違っているのです。 –

+0

Javascriptの配列は、数値プロパティと 'length'プロパティを持つエキゾチックなオブジェクトです。 'new Array(3)'の場合、 'length'オブジェクトを3に設定し、数値プロパティを持たない 'Array'オブジェクトを生成します。これは次のとおりです。 > Object.keys(new Array(3)); [] > Object.keys([未定義、未定義、未定義]); ["0"、 "1"、 "2"] ['Array.from'](https://developer.mozilla.org/en-US/docs/Web/JavaScript)を使用して、/Reference/Global_Objects/Array/from?v = control): > Object.keys(Array.from(length:3})); ["0"、 "1"、 "2"] – error

+0

Doh。私の答えを投稿する前にロックされています。 – error

答えて

3

javascriptには配列型がないことを理解するのに重要なことです。組み込みのArrayは標準Objectを包む便利なものです。唯一の違いは、配列に特別な方法で計算されたlengthプロパティがあることです。

new Array(3)は、単一のlengthフィールドを持つオブジェクトを返します。他のキーは含まれていません。

{ 
    length: 3 
    0: undefined, 
    1: undefined, 
    2: undefined, 
} 
map

及び他のイテレータは実際にオブジェクトに存在する数字キーを捜すため、違い:

{ 
    length: 3 
} 

[undefined, undefined, undefined]は3つの数字スロット付きオブジェクトを作成します。 mapforEachや友人の背後にある論理は、このようなものです:

for (var i = 0; i < A.length; i++) 
     if (A.hasOwnProperty(i)) 
      do something with A[i] 
3

new Array(3)は、[未定義、未定義、未定義]と同等の3つの未定義を含む長さ3の配列を返します。

MDNによらない:

あなたがのために新しいアレイ(3)Javascriptの埋蔵量のメモリを行うとき、これは実際の未定義の値

3

とにarrayLength空のスロットではなく、スロットの配列を意味します3つの要素からなる配列ですが、それらを定義しません。

[未定義、未定義の未定義]を介して配列を作成すると、実際には3つの要素が作成され、それぞれの値は未定義です(したがって、長さ3の配列です)。

関連する問題