【问题标题】:How to change a object by function如何通过函数更改对象
【发布时间】:2015-09-20 16:01:15
【问题描述】:

在一项任务中,我必须通过将对象传递给函数来更改它。几乎是这样的:

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[three] 设置为 3,并且效果很好。

fn2 用于替换另一个对象。执行后obj应该只包含'four':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 中工作。我对 fn2 失败而 fn1 工作感到困惑。如何解决?

【问题讨论】:

标签: javascript


【解决方案1】:

在 JavaScript 中,参数是按值传递的,尽管该值通常具有类似指针的语义。当您运行obj['three'] = 3; 时,您不会重新绑定变量obj;您只是在更改 obj 当前持有的对象的属性。另一方面,当您重新分配obj 时,您正在更改变量 obj,而不是变量曾经保存的对象。你无法在 JavaScript 中实现你想要的语义;你能做的最好的就是删除obj 的所有属性并复制你想要的任何属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 2020-08-11
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2023-02-15
    相关资源
    最近更新 更多