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;
}