2016-04-16 20 views
2

初期化されていない値の配列e.g. new Array(100)は、forEachで繰り返されません。長さは正しいです。 [undefined,undefined,...]で配列を作成すると、期待どおりに反復されますが、[,,,,,]で配列を作成すると配列は作成されません。forEach初期化されていない配列

誰かが私にこのことを説明できるかどうか疑問に思っています。

var array = new Array(100), 
 
    msg; 
 

 
_init(); 
 

 
console.log("Array length:",array.length); 
 

 
// forEach is skipped 
 
a = ["forEach:"]; 
 
(array).forEach(function(i){ 
 
    a.push(i); 
 
}); 
 
console.log(a.join(',')); 
 

 

 
// forEach is also skipped 
 
a = ["forEach array without undefined:"]; 
 
([,,,]).forEach(function(i){ 
 
    a.push(i); 
 
}); 
 
console.log(a.join(',')); 
 

 
// forEach is displayed 
 
a = ["forEach normal array:"]; 
 
([undefined,undefined,undefined,undefined]).forEach(function(v,i){ 
 
    a.push(v); 
 
}); 
 
console.log(a.join(',')); 
 

 
// for is displayed 
 
a = ["for:"] 
 
for(var i=0;i<array.length;i++){ 
 
    a.push(i); 
 
} 
 
console.log(a.join(',')); 
 

 
// array.join is displayed (even the ough the values are empty) 
 
a = ["join:"] 
 
a = a.concat(array) 
 
console.log(a.join(',')); 
 

 
// log to target div (ignore this) 
 
function _init(){ 
 
    console = {log:targetlog}; 
 
} 
 
function targetlog(){ 
 
    var args = Array.prototype.slice.apply(arguments); 
 
    $("#target").append("<div>" + args.join(" ") + "</div>") 
 
}
span { 
 
    outline:1px solid gainsboro; 
 
    margin:2px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="target"></div>

+0

'array.forEach(...'? –

答えて

2

誰かが私にこれを説明することができる場合、私は思ったんだけど。

これは仕様です。

forEachであり、その兄弟は疎配列の「穴」を無視します。詳細については、this blog postを参照してください。 MDNから

forEach()配列

内の各要素に対して一度spec存在を提供するコールバックを実行には、同じことを言います。

+0

Array.apply(null、Array(3))ではなく '(配列).forEach(..')の理由はまさに私が探していたものです。 ! – Shanimal

+1

穴を埋める場合は、 'Array#fill'が利用可能であれば' Array(3).fill() 'も有効です。 –

+0

ノードの古いバージョンを使用しています。 :( – Shanimal

関連する問題