Javascript 通过引用传递全局变量并修改引用的变量
正确的方法是什么Javascript 通过引用传递全局变量并修改引用的变量,javascript,pass-by-reference,Javascript,Pass By Reference,正确的方法是什么 var array1 = [] var array2 = [] function doIt(arg){ var myArray; if(arg == 1){ myArray = array1 }else if(arg == 2){ myArray = array2 } myArray.push('test'); } doIt(1); //array1 should now be ['test']
var array1 = []
var array2 = []
function doIt(arg){
var myArray;
if(arg == 1){
myArray = array1
}else if(arg == 2){
myArray = array2
}
myArray.push('test');
}
doIt(1); //array1 should now be ['test'] but it's empty
除了四个小的语法缺陷外,您的代码还可以:
var array1=[];// 为什么不:
var myArray = arg == 1? array1 : array2;
如果有两个以上的选择,您可以尝试:
var source = {
'1': array1,
'2': array2,
'3': array3,
...
}
或零–索引:
var source = [ ,array1, array2, array3, ...];
然后:
甚至:
var doIt = (function() {
var source = {
'1': array1,
'2': array2,
'3': array3,
...
}
return function (arg) {
var myArray = source[arg];
}
}());
填充您的靴子。:-) 可以说,这样做的“正确”方法不是编写带有副作用的函数。您可以编写函数,使其返回数组的修改副本:
var array1 = [1, 2, 3],
array2 = [4, 5, 6],
x = getUserInput(),
result = doIt(1, x == 1 ? array1 : array2);
function doIt(arg, original_array){
var copy = [].concat(original_array);
// ...
return copy;
}
有时这是不可避免的,但当局部函数更改全局状态时,程序调试会变得更加困难。你所说的“它是空的”到底是什么意思?顺便说一句,您缺少了一些分号。@AdamBernier:JavaScript是否插入了有用的自动分号以使程序员的生活更轻松?此外,我假设“空”表示array1
不包含任何元素(这是因为myArray=array
复制了数组)。@Kerrek SB:你可能是对的;某些开发环境可能会自动插入分号。关于第二点:数组是对象,通过引用传递。Javascript不通过引用传递。与Java一样,对象隐藏在引用后面,并通过value@ofko-我认为问题中的代码没有任何错误,只是如果使用1或2以外的值调用函数,则会出现错误(在这种情况下,它将尝试执行undefined.push()
)。但是如果值为1,它应该像您期望的那样工作。是否有其他未显示的代码可能会影响它?那些“缺少”的分号都是可选的。我更喜欢将它们作为一种风格来包含,但是不管有没有它们,这个特定的代码都会完全相同。(我承认有些情况下分号的加入很重要,但事实并非如此。)@nnnnnn:这是很有趣的行为,谢谢。感谢Kerrek SB在其他评论中提到了这一点。我发现我的代码为arg
传递了错误的值,这就是问题所在。我希望这会对其他人有所帮助。好吧,它们都是实现问题的其他方法,但是为什么原始代码不能按原样工作呢?
var doIt = (function() {
var source = {
'1': array1,
'2': array2,
'3': array3,
...
}
return function (arg) {
var myArray = source[arg];
}
}());
var array1 = [1, 2, 3],
array2 = [4, 5, 6],
x = getUserInput(),
result = doIt(1, x == 1 ? array1 : array2);
function doIt(arg, original_array){
var copy = [].concat(original_array);
// ...
return copy;
}