「インデックスカウント」とは、あなたがlength
財産を意味すると思います。その場合、最初の質問に対する答えは「いいえ」です。length
プロパティは、配列の最高の数値インデックスに関連付けられています。したがって、たとえば、次のコードがある場合は、次のようにarr.length
なります4
。
var arr = [];
arr[3] = true;
arr.length; //is 4
ただし、この状況では奇妙な動作をするfor-inループを参照しました。(上から) for-inを実行するとarr
、次のようになります。
var output = "";
for (i in arr) { //Don't do this!
output += i;
}
output; //is "3" (not "0123" as you might expect)
前述したように、プロトタイプのプロパティは長さに影響を与えません。
Array.prototype.foo = true;
var arr = [];
arr[3] = true;
arr.length; //is 4
ただし、これらはfor-inループに影響を与えます(通常の状況では)。
var output = "";
for (i in arr) { //arr from the previous code block.
output += i;
}
output; //is "3foo" (or maybe "foo3", there's no guarantee form the spec either way)
これを回避する方法はいくつかあります。まず第一に、この種のナンセンスのために、配列オブジェクトでfor-inを使用することは絶対にしないでください。ただし、何らかの理由でそれを実行する必要がある場合は、次のように、常にhasOwnProperty()
フィルターを使用してfor-inループを保護する必要があります。
var output = "";
for (i in arr) { //arr from the previous code block
if (arr.hasOwnProperty(i)) {
output += i;
}
}
output; //is "3"
繰り返しになりますが、for-inでの注文の保証はありません。したがって、もしそうなら、あなたはとして得るかもしれませんarr
(それはありそうもないですが)。[1,1,1]
output
"201"
もう1つのオプションは、ES5の機能(存在する場合)を使用して、プロトタイプ化されたプロパティを列挙不可に設定することでオブジェクトレベルで保護することにより、他の人の悪いコーディングから身を守ることです。あなたはこのようにそれをするでしょう:
var foo = (function() { /* do something */ });
if(typeof Object.defineProperty === "function") { //If ES5
Object.defineProperty(Array.prototype, "foo", {
value: foo,
enumerable: false //make it not enumerable
});
} else { //For older browsers
Array.prototype.foo = foo;
}
var arr = [], output = "";
arr[3] = true;
for(i in arr) { //Seriously, don't do this.
output += i;
}
output; //is "3"
アレイに対してfor-inを実行することは悪い考えであることを十分に強調することはできません。実際、私はほとんどすべての状況下でfor-inを避ける傾向があります。なぜなら、そこにいる誰かがジャークになりたいかどうかわからず、これをコードの途中に投げ込むからです。
Object.prototype.ponies = "Ponies!";