配列にアイテムを追加してそのアイテムにアクセスできますが、length
レポートは0
。なんで?
var arr = [];
arr[4294967300] = "My item";
console.log(arr[4294967300], arr.length); // Outputs "My item", 0
配列にアイテムを追加してそのアイテムにアクセスできますが、length
レポートは0
。なんで?
var arr = [];
arr[4294967300] = "My item";
console.log(arr[4294967300], arr.length); // Outputs "My item", 0
これは、インデックスが非常に大きいため、代わりにプロパティに変換されるため、長さが0になるためです。
ECMAScriptのドキュメントによると、特定の値pは、次の場合にのみ配列インデックスになります。
(p >>> 0 === p) && (p >>> 0 !== Math.pow(2, 32) - 1)
ここ>>> 0
ではと同等ToUint32()
です。あなたの場合:
4294967300 >>> 0 // 4
定義上、length
プロパティは常に最大の有効なインデックスの数値より1つ多くなります。負のインデックスはあなたに同じ振る舞いを与えるでしょう、例えば
arr[-1] = 'hello world';
arr.length; // 0
arr['-1']; // 'hello world'
数値が有効なもの(およびインデックスとして使用される)と「無効な」(プロパティに変換される)の範囲にある場合は、すべてのインデックスを文字列にキャストし、プロパティを最後まで処理することをお勧めします(開始の{}
代わりにArray
)。