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が開始されます.これ以上追加するのではなく上書きされます.