2014-11-15 172 views
2

誰能告訴我爲什麼所有的object.num打印爲1?這讓我發瘋。不管怎樣,在for循環之後,object.num = 1的值無論如何,即使它們從未設置爲1.請複製整個段進行調試。傳遞參考?

<script type="text/javascript"> 
window.addEventListener("load", main, false); 

const n = 4; 

function main() 
{ 
    var belt = new Array(4*n); 
    initArr(belt); 
    printIt(belt); 
    populateArr(belt); 
    printIt(belt); 
    reorder(belt); 
    printIt(belt); 
} 

function populateArr(arr) 
{ 
    var a = {name:"a", num:0}; 
    var b = {name:"b", num:0}; 
    var end = arr.length; 
    var i = end-1; 

    for(var temp = n; temp > 0; temp--) 
    { 
     a.num = temp; 
     arr[i] = a; 
     i-=2; 
    } 

    i = end-2; 
    for(var temp = n; temp > 0; temp--) 
    { 
     b.num = temp; 
     arr[i] = b; 
     i-=2; 
    } 

    return arr; 
} 

function printIt(arr) 
{ 
    var tempArr = new Array(arr.length); 
    for(var i=0; i < arr.length; i++) 
    { 
     tempArr[i] = arr[i].name + arr[i].num; 
    } 
    console.log(tempArr); 
} 

function initArr(arr) 
{ 
    var nothing = {name:null, num:0}; 
    for(var i=0; i<arr.length; i++) 
    { 
     arr[i] = nothing; 
    } 
    return arr; 
} 

function reorder(arr) 
{ 
    var nothing = {name:null, num:0}; 
    var counter = 0; 
    var aIndex = 0; 
    var bIndex = null; 
    for(var i=0; i < arr.length; i++) 
    { 
     if(arr[i].name === "b" && bIndex === null)//first b doesn't get moved 
     { 
      bIndex = i+1; 
     } 

     else if(arr[i].name === "a") 
     { 
      arr[aIndex] = arr[i]; 
      arr[i] = nothing; 
      counter++; 
      aIndex++; 
     } 
     else if(arr[i].name ==="b") 
     { 
      arr[bIndex] = arr[i]; 
      arr[i] = nothing; 
      counter++; 
      bIndex++; 
     } 
    } 
    console.log("count: " + counter); 
    console.log("n: " + n); 
    return arr; 
} 

</script> 

回答

1

不知何故,object.num的for循環的值後= 1不管是什麼,即使他們從來沒有設置爲1

是「他們」 - 「他們「重新」在該環路的最後一次迭代設置爲1:

for(var temp = n; temp > 0; temp--) 
{ 
    a.num = temp; 
    arr[i] = a; 
    i-=2; 
} 

該循環的最後一次迭代是當temp是1

現在,實際上只有一個對象 - 並且將數組的每個元素都設置爲對該對象的引用。這就是爲什麼數組中的所有值看起來都一樣。如果你想創建一個不同的對象每一次,你應該使用:

for(var temp = n; temp > 0; temp--) 
{ 
    arr[i] = { name: "a", num: temp }; 
    i -= 2; 
} 
+0

感謝,因爲我有同樣的問題,我也發現了答案我Quetion,但你的答案是真正偉大的再次感謝 –

+0

謝謝,我真正體會到了快速響應。它從來沒有想過只有一個對象被引用。 –