2011-12-29 122 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