.length
の変更はChromeによって禁止されています。これを実行します。
var x = [];
x.length = +Infinity; // Uncaught RangeError: Invalid array length
ので、幸いにも、ここに危険性がありません。 For
無限ループ。おそらくメモリの終わりのために多少早く終了するでしょう。
でも、これと同じようにlength
を変更することは可能です。もしそれを大きくするとどうなるでしょう?
var x = [9];
console.log(x); // [9]
x.length = 10;
console.log(x); // still [9], although length is 10 this time
// example from Red Mercury
x.forEach(function (item, index) {
console.log('Item', index, item);
});
// will print: Item 0 9
// But...
do {
console.log(x.shift());
} while(x.length > 0); // .shift() and .pop() update .length property
// will print 9 once, and nine times undefined
// probably the same with .pop(), just in reversed order
と小さいですか?
var x = [9, 10, 14];
console.log(x); // [9, 10, 14]
x.length = 1;
console.log(x); // [9]
// example from Red Mercury
x.forEach(function (item, index) {
console.log('Item', index, item);
});
// will print: Item 0 9
// But...
do {
console.log(x.shift());
} while(x.length > 0);
// will print only 9
大きな長さが.forEach()
で確認することができながら、だから、小さくはできません。長さの値を変更することはお勧めしません(.forEach()
と.shift()
が「非同期化」を開始します)。しかし、あなた自身のコードでは、これはあなたに起こるべきではありません。私は言語が完全に防弾でなければならないとは考えていません。現実はブラウザでスクリプトが壊れて最終的にそれをチェックし、プログラマーをあまりにも制限する可能性があります。JavaScriptにオブジェクトのような配列だけでなく、適切な配列があれば、それは防ぐことができますが、それはそれです。
出典
2016-09-10 01:00:33
Seb
私があなたの質問から理解しているところでは、誰かが 'array.length'プロパティを上書きすることが懸念されます。あれは正しいですか?もしそうなら、@RedMercuryが説明したような 'forEach'を使用するか、または' for''をあなたの配列にループさせて、長さを計算してください。 – shriek
少なくともChromeは 'array.length'をInfinity:' Uncaught RangeError:配列の長さが無効です 'に設定することを拒否します。 – Seb
これは非常に理論的な問題です。実際、array.lengthは配列の要素数と非常に強い関係があることを知っています。 –