在一项任务中,我必须通过将对象传递给函数来更改对象。它几乎是这样的:
function change(obj) {
return {
fn1: function() {
obj['three'] = 3;
},
fn2: function() {
obj = {'four':4};
}
};
}
var obj = {'one':1,'two':2};
console.log(obj); // output 'Object {one=1, two=2}'
var temp = change(obj);
temp.fn1();
console.log(obj); // output 'Object { one=1, two=2, three=3}'
temp.fn2();
console.log(obj); // output 'Object { one=1, two=2, three=3}'
fn1用于更改对象的值之一。正如你所看到的,它打算将obj [3]设置为3并且效果很好。
fn2用于替换另一个对象。 obj在执行后应该只包含'4':4,但它不起作用。
然后我检查fn2里面的obj的值:
...
fn2: function() {
console.log('before fn2',obj);
obj = {'four':4};
console.log('after fn2', obj);
}
};
...
输出结果为:
'before fn2 Object{one=1,two=2,three=3}'
'after fn2 Object{four=4}'
所以它确实在fn2中工作。当fn1工作时,我感到困惑fn2失败了。如何解决?
答案 0 :(得分:2)
在JavaScript中,参数是按值传递的,尽管该值通常具有类似指针的语义。当您运行obj['three'] = 3;
时,您不会重新绑定变量obj
;您只是在更改obj
当前持有的对象的属性。另一方面,当您重新分配obj
时,您正在更改变量 obj
,而不是变量用于保存的对象。您无法在JavaScript中实现所需的语义;您可以做的最好的事情是删除obj
的所有属性,并复制您希望在其上的任何属性。