@user1689607のコメントが答えのようです。を選択するno lib (pure JS)
と、コードは値をログに記録しませんundefined
。重要なのは、libsはネイティブタイプのプロトタイプをいじることが多いということです。そうするための最も悪名高いlibはprototype.js
(手がかりは名前にあります)です。たとえば、通常の変更されていないオブジェクトの「魔法のプロパティ」は列挙できません(つまり、配列のループに表示されません)。ただし、独自のプロパティとメソッドを追加し始めると、それらが表示される可能性があります。はプロトタイプから派生しているため、そのプロトタイプへの変更も表示される可能性があります。Array
for...in
Array
Object
その長所と短所は次のとおりです。決して、アレイで使用することはありません。for...in
(オブジェクトで)使用する場合for...in
は、処理しているプロパティがそのオブジェクトに直接設定されており、プロトタイプからのものではないかどうかを常に確認してください。
for (var prop in someObject)
{
if (someObject.hasOwnProperty(prop))
{
//do stuff
}
}
アレイに関する限り:for(var i=0;i<theArray.length;i++)
ほとんどの問題を回避するのに役立つはずです(アレイはJSではスパースであることに注意してください):
var normalArray = [1,2];
var sparseArray = [1,2,3,4];
delete sparseArray[2];//will log [1,2,undefined,4]
for (var i=0;i<sparseArray.length;i++)
{
if (i < normalArray.length)
{
console.log(normalArray[i]);
}
console.log(sparseArray[i]);//will log 1 - 2 - undefined - 4
if (sparseArray.hasOwnProperty(i))
{
console.log(sparseArray[i]);//logs 1 - 2 - 4
}
}