2011-12-29 163 views
0
var Stars = new Array(1,2,3,4,5,6,7,8,9,10); 
var StarsX = new Array(451,455,460,470,490,100,160,220,280,300); 
var StarsY = new Array(451,455,460,470,490,480,390,330,200,120); 
var Starsm = Stars 
var StarsmX = StarsX 
var StarsmY = StarsY 

//just shows the output of the variables in a text field 
function contpost(){Tfield.innerHTML=Stars + "<br/>" + StarsX + "<br/>" + StarsY + "<br/>" + Starsm + "<br/>" + StarsmX + "<br/>" + StarsmY;} 

//cycles through the "for" loop and posts the variables 
function newpost(){ 
for (var i=0;i<Stars.length;i++){ 
    StarsmX[i] = StarsX[i] + 10; 
    StarsmY[i] = StarsY[i] + 10; 
    } 
contpost() 
} 


var Tfield= (This is the text field) 
var canv_one= (This is a canvas in my document) 
canv_one.addEventListener('click', newpost); 

如果我運行這個代碼(Firefox 9),if/then循環將「mX」變量和「X」變量都加10。Javascript變量聲明問題

我現在知道大約是怎麼做的。這只是因爲我很早就設定了他們。當我在聲明中替換它時,它正常工作:

var Starsm = new Array() 
var StarsmX = new Array() 
var StarsmY = new Array() 

我不明白的是爲什麼javascript會這樣做。對我來說,如果你把它們設定爲平等一次,在全球宣言期間,它們不會在以後重新相同(並且在後面做這件事,我從來沒有將StarsX設置爲StarsmX。)

I' m非常確定這意味着我不瞭解Javascript的某種基本功能,這讓我很擔心。

任何人都可以幫忙嗎?

+0

只是一個預留:創建陣列的優選語法爲當'[]'而不是'新的Array()'(短,容易閱讀,並且避免了該問題,其中主叫'新陣列(5)'創建一個數組與五個元素,而不是一個元素的值爲5)。所以'var Stars = [1,2,3,4,5,6,7,8,9,10];'和'var Starsm = [];' – nnnnnn 2011-12-29 03:31:11

+0

OK。我會稍後回去改變它。我基本上從我可以谷歌學習JavaScript。 ...最佳實踐並不總是很清楚。 – Brightstar 2011-12-29 03:32:51

+0

很酷。你可能想看看MDN:https://developer.mozilla.org/en/JavaScript/Guide。此外,Google提示:如果您想了解某些JavaScript關鍵字或功能,請在您的Google搜索字詞的末尾添加「mdn」或「mdc」,例如「array mdn」 - 這樣可能會帶來MDN關於該關鍵字/功能的頁面放在搜索結果的頂部 - 通常您甚至不需要單詞「javascript」。 – nnnnnn 2011-12-29 03:42:54

回答

4

它不向變量添加任何內容。它將添加到數組中,並且這兩個變量都引用相同的Array對象。

這是因爲在JavaScript中,您只能將引用保存到對象,而不是對象本身。所以對數組的引用是被複制的值,而不是數組。

如果你想要的陣列的淺克隆,使用slice()

var Starsm = Stars.slice() 
var StarsmX = StarsX.slice() 
var StarsmY = StarsY.slice() 

或者只是照你說的去做,並創建空的數組。

+0

所以你說基本上,我所做的就是說「starsm」現在是一個包含數組「星星」的變量? 我的意圖是創建一個名爲「Starsm」(等)克隆原始的新陣列。 – Brightstar 2011-12-29 03:25:22

+0

@ user1120353:是的。 var Starsm = Stars'拷貝由'Stars'保存的對象引用,所以它們最終都會引用同一個Array對象。要(淺)克隆原始數組對象,可以使用'.slice()'。 – 2011-12-29 03:27:40

+0

謝謝。由於某種原因,我可以做到的想法甚至還沒有出現在我身上。 我很感激即時的幫助。 – Brightstar 2011-12-29 03:29:42