JavaScript配列の越境問題のメモ
1676 ワード
テストの過程で、「データからデータを取って結果はunefined」という状況が発生しました.プログラムでundefinedデータをフィルタリングしました.そこで問題が発生したと考えています.最後のチェックはjsの配列インデックスが境界を越えました.java言語は配列が境界を越えると異常が発生しますが、jsの配列は特殊な対象であり、一般的には境界を越えることができます.
var a = []; //
a[Math.pow(2, 32) - 2] = " "; // length , a . Math.pow(2, 32) - 1 (4294967295), 0 , Math.pow(2, 32) - 2
console.log(a.length === Math.pow(2, 32) - 1); //true,a length
try {
a.push(" 1", " 2"); // push ,
} catch (e) {
console.log(e instanceof RangeError); // true,
}
console.log(a.length === Math.pow(2, 32) - 1); // true, , 4294967295, ?push ?
console.log(a[Math.pow(2, 32) - 1] === " 1");// true, , !
console.log(a[Math.pow(2, 32)] === " 2"); // true, !
try {
a.push(" 3?"); // push
} catch (e) {
console.log(e instanceof RangeError); // true,
}
console.log(a[Math.pow(2, 32) + 1]); //undefined, ?
console.log(a[Math.pow(2, 32) - 1]) //" 3?",
console.log(a[Math.pow(2, 32)]) //" 2",
JavaScriptの配列はちょっと特殊な普通のオブジェクトです.Aray.prototype.pushの方法を実行する時、まず各pushの元素をpushに入れます.つまり、複数の自身の属性を定義します.そして、配列を設定するlength属性は最大のインデックス値+1(ES 5 15.4.4.5)です.この例はMathpowです.(ES 5 15.4.5.5.1.3.d)しかし、上の要素はすでにpshに入れられています.またshを押すと、現在のlength属性-1のインデックスからpshが開始されます.これ以上追加するのではなく上書きされます.