2013-06-21 55 views
-7

這是示例代碼。這是javascript中的錯誤嗎? Array對象的方法推送

window.onload = function() { 
    var i, arr = [], result = []; 

    arr.push(1); 
    arr.push(2); 
    arr.push(3); 

    for (i = 0; i < 20; i++) { 
     arr.push(5); 
     arr.push(6); 

     result.push(arr); 
     arr.length = 3; 
    } 

    console.log(result); 
} 

輸出:

Array[20] 

0: Array[3] 

1: Array[3] 

2: Array[3] 

etc... 
+7

你在期待什麼? – OrangeDog

+3

你的「bug」在哪裏? – Sirko

+0

我猜'arr.length = 3;'的結果導致了「bug」 –

回答

3

你的數組的數組包含參考到你設置的爲3的長度這正是你應該得到的結果的數組。 Link to ECMA 5.1.

2
window.onload = function() { 
    //create ONE array arr and one array result 
    var i, arr = [], result = []; 

    //fill array with three values 
    arr.push(1); 
    arr.push(2); 
    arr.push(3); 


    for (i = 0; i < 20; i++) { 
     //fill array with two more values 
     arr.push(5); 
     arr.push(6); 

     //add a reference to arr to result 
     result.push(arr); 

     //change the length of arr to 3 => delete the last two items 
     arr.length = 3; 
    } 
    //----> this repeats twenty times. you add two items to arr, add a reference to arr 
    //to result and delete the two items again. but the references that are stored in  
    // result will always point to one and the same array arr. 

    //and that's what you get in the end: and array filled with 20 references to another 
    //array with three items in it. 
    console.log(result); 
} 
+0

+1,但不要將你的整個答案寫成代碼塊中的註釋 – AD7six

0
result.push(arr); 

當你調用上面,你有沒有推改編的內容到結果;你已經將arr本身推到了結果上。

你的循環第一次運行時,arr有3個元素,你再往上推2個元素; arr現在有5個元素(1,2,3,5,6)。你推arr到結果 - arr仍然有5個元素,結果有1個元素,它是對arr的引用。

現在你將arr的長度設置爲3,所以arr有3個元素(1,2,3)。結果仍然有一個元素,它仍然是對arr的引用。

除此之外,我不確定你期待什麼,也不知道你認爲錯誤在哪裏。如果您仍然認爲存在問題,您將不得不進行更多解釋。

相關問題