将函数中本地创建的数组分配给全局定义的数组javascript

将函数中本地创建的数组分配给全局定义的数组javascript,javascript,arrays,Javascript,Arrays,我在分配数组时遇到问题: var obj = [ {'id': 1, 'size': 'king' }, {'id':4, 'size': 'queen'} ]; function modify(o){ var result=[{'id': 1, 'size': 'king'}]; o=result.slice(); } modify(obj); document.write("result:" + JSON.stringify(o

我在分配数组时遇到问题:

    var obj = [ {'id': 1, 'size': 'king' }, {'id':4, 'size': 'queen'} ];
    function modify(o){
      var result=[{'id': 1, 'size': 'king'}];
      o=result.slice();
    }
    modify(obj);
    document.write("result:" + JSON.stringify(obj)); //obj both 'king and queen'
我希望用“result”数组中的数据填充“obj”,但这种方法不起作用。可以将数组设为空并按如下方式更改其内容:

    o.length=0;//obj is empty outside of the function
    o[1].id = 100;//id is changed outside of the function
我知道我可以通过返回'result'数组并将其分配到t'obj之外来实现这一点,但函数中会有更多这样的关联。
任何帮助都将不胜感激。谢谢

如果您希望在函数中进行赋值,有两种方法可以实现这一点。您可以更改obj的内容,并以干净的方式将其作为参数传递:

var obj = [ {'id': 1, 'size': 'king' }, {'id':4, 'size': 'queen'} ];
function modify(o){
  var result=[{'id': 1, 'size': 'king'}];
  o.length = 0;
  o.push.apply(o,result); // push every element from result
}
modify(obj);
console.log(obj);
或者您可以更改对其他内容的引用。在这种情况下,必须使用实际变量,而不是函数的参数:

var obj = [ {'id': 1, 'size': 'king' }, {'id':4, 'size': 'queen'} ];
function modifyObj(){
  var result=[{'id': 1, 'size': 'king'}];
  obj = result.slice();
}
modify();
console.log(obj);
第二种方法的一点改进是将数组保留在对象中,但这会改变在代码的其余部分中访问数组的方式:

var container = { 
  obj : [ {'id': 1, 'size': 'king' }, {'id':4, 'size': 'queen'} ] 
};
function modify(container, key){
  var result=[{'id': 1, 'size': 'king'}];
  container[key] = result.slice();
}
modify(container, 'obj');
console.log(container.obj);

修改obj后,预期输出仅为“king”吗?是的,这是预期输出。这是不可能的。JavaScript没有按引用传递。但是,您实际上可以修改传递的数组对象,而不是覆盖它,而是更改其内容。也许您不应该再命名第二个函数
modify
。@Bergi事实上,我更新了它的名称,以表明它更改了外部范围中的变量。我还调整了最后一个想法,允许将对象的“名称”作为参数传递。哎呀,它实际上修改了变量…我曾想象过一个
返回值
,与其他答案中的一样-但感谢您的澄清:-)