4

配列にアイテムを追加してそのアイテムにアクセスできますが、lengthレポートは0。なんで?

var arr = [];
arr[4294967300] = "My item";
console.log(arr[4294967300], arr.length); // Outputs "My item", 0
4

1 に答える 1

6

これは、インデックスが非常に大きいため、代わりにプロパティに変換されるため、長さが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)。

于 2012-10-16T10:27:24.007 に答える