2016-05-27 17 views
5

配列のコンストラクタArray()を使用してnの長さの配列をすばやく作成してから、結果の配列をループしたいと考えています。 MDN's docs当たりfor eachループを使用する配列(n)、未定義の値の配列

Arrayコンストラクタに渡される唯一の引数は、0と2 -1(含む)の整数 ある場合、これはに設定された長さと新しいJavaScript配列 を返しますその番号。引数が他の数値の場合は、 RangeError例外がスローされます。

おそらくArray(5)を実行すると、長さ5の配列が作成されます。

var arr = new Array(5); 
 

 
console.log(arr); // [undefined x 5] 
 
console.log(arr.length); // 5

私は結果の配列をループに試してみて、値またはインデックスをログアウトするときしかし、何も起こりません。私は、配列リテラルを使用し、値をループしようとした場合

arr.forEach(function(v, i) { console.log(v, i); }); 

// nothing logs to the console 

あるいは、それは予想通り記録します:

[undefined, undefined].forEach(function(v, i) { console.log(v, i); }); 
 

 
// undefined 0 
 
// undefined 1

できないのはなぜIループオーバーArrayコンストラクタで作成された配列?


This answermapで発生し、ブラウザのストレンジネスのいくつかを説明します例:

arr.map(function(v, i) { return i; }) // returns [undefined x 5] 

しかし、私はforEachループは全くオーバーを反復しない理由で特に興味値。

arr.forEach(functio(v, i) { 

使用この代わりに::

arr.forEach(function(v, i) { 

UPDATE

のforEach()各要素に対して一度に提供するコールバックを実行

+0

'[,,]のforEach(console.log.bind(コンソール、 'ログイン:'))'も –

+0

:)壊れしかし 'Array.apply(nullは、新しいと思われます[OK] –

+0

これは[JavaScript "new Array(n)"と "Array.prototype.map" weirdness]と同じです(http:// stackoverflow .com/q/5501581/1529630)、 'forEach'を使用します。 – Oriol

答えて

4

私は直接質問に答えるつもりはないことを理解していますが、これは良い情報を提供していると思います。

Check what Kyle Simpson said recently about this topic.

基本的に、

console.log(new Array(5)) // Chrome: [undefinedx5] Firefox: [ <5 empty slots> ] 

console.log([undefined, undefined, undefined, undefined, undefined]) // [ undefined, undefined, undefined, undefined, undefined ] 

全く異なる値型です。そして、ブラウザは、undefinedx5というとき、あなたに横たわっています。最初のケースに.map()を適用すると何も返されませんが、2番目のケースでは未定義で操作できます。スペック、ecma-262/5.1/#sec-15.4.2.2new Array(5)が行う唯一のことから、

は実際に型を置き、lengthプロパティ= 5配列リテラル構文、[]を持つクラス型配列のオブジェクトを作成することです(あなたがそれに何かを与える場合)スロットに入れます。

+0

ここで彼が言うことについて、簡単な説明を追加できませんか? –

+0

新しいArrayオブジェクトで 'JSON.stringify()'を使うと、一連のヌルが得られるはずです。私はそれが注目に値すると思う。 –

2

はあなたのコードのタイプミスを持っているように見えます配列内に昇順で存在する。削除されたか、初期化されていない(つまり、疎な配列の)インデックスプロパティに対しては呼び出されません。 MDN article

+0

申し訳ありませんが、 。しかしながら、問題は依然として存在する。 – Himmel

+0

ちょうどタイプミス。問題はそこにある。 –

+0

答えを更新しました。それぞれが定義されていないプロパティをスキップします。 –

-1

これは、Array(int)コンストラクタではなく、Javascript foreachループの複雑さと関係している可能性があります。通常のforループを使用して:

for(var i = 0; i < arr.length; i += 1) { 
    console.log(arr[i] + " " + i); 
} 

希望の結果が得られました。

2

これは、ES5配列メソッドが欠落しているインデックスをスキップするためです。つまり、i0からlength-1に反復しますが、各繰り返しで配列にi独自のプロパティがあるかどうかがチェックされます。

場合は、fillを使用してインデックスを作成できます。 。

var arr = new Array(5).fill(); 
 
arr.forEach(function(v, i) { console.log('arr['+i+'] = ' + v); });

関連する問題