JavaScript數組越界問題 的 筆記

        在測試的過程中,遇到“從數據裏取數據,結果是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中的數組就是一個稍微有點特殊的普通對象.在Array.prototype.push方法執行時,會先把每個要push的元素push進去,也就是定義多個自身屬性(ES5 15.4.4.7.5).然後才設置數組的length屬性爲最大的索引值+1(ES5 15.4.4.7.5),這個例子中就是Math.pow(2, 32) + 1,這時纔會報錯(ES5 15.4.5.1.3.d),但上面的元素已經push進去了.如果再次push的話,還會從當前的length屬性-1的那個索引處開始push,也就出現了覆蓋而不是繼續追加的情況.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章