Object.assign() - 奇怪的行为需要解释

时间:2016-12-14 18:26:04

标签: javascript object assign

我有这段代码:



function margeOptions(options, passedOptions) {
  options = Object.assign(options, passedOptions); 
}

let passedOpts = {a: true};
let opts = {a: false};

margeOptions(opts, passedOpts); 
console.log(opts); // as expected returns {a: true} 




但是当我改变一点功能时,就像这样:



function margeOptions(options, passedOptions) {
  options = Object.assign({}, options, passedOptions); 
}

let passedOpts = {a: true};
let opts = {a: false};

margeOptions(opts, passedOpts); 
console.log(opts); // this time returns {a: false} <-- !
&#13;
&#13;
&#13;

那么这里真的发生了什么?

2 个答案:

答案 0 :(得分:2)

Object.assign将您提供的对象的属性设置为第一个参数;它也返回相同的对象。因此,在您的第一个示例中,由于您将option作为第一个参数传递,因此会使用新的/更新的属性进行更新。在你的第二个例子中,你并没有将它作为第一个参数传递,它只是其中一个来源&#34;从中读取属性的对象,因此不会更新。

如果您的混淆是分配没有改变opts的原因,那么它是因为分配参数对外面的任何事情没有任何影响功能。 E.g:

function foo(a) {
    a = 42;
}
var x = 67;
foo(x);
console.log(x); // Still 67

这是因为foo(x)读取x并将其传递给fooax之间没有任何关联,而a的值最初来自x

opts / options完全相同。 mergeOptions(opts, passedOptions)读取opts,这是一个对象引用,并将该值传递给mergeOptions。该值与opts之间没有持续的联系。对象引用指向对象,而不是变量opts

答案 1 :(得分:2)

Object.assign()函数修改第一个对象参数的内容。因此在第一个函数中:

options = Object.assign(options, passedOptions); 

您的代码有效,因为options是第一个参数。请注意,返回options参数的分配无效,或至少没有任何有用的效果。它会将Object.assign的返回值分配给options变量,但这是它已经存在的值。

第二个函数传递一个新构造的空对象作为第一个参数,这意味着不会修改作为options传递的对象。修改后的对象被分配回options,但因为它只是一个函数参数,不会更改调用环境中的引用。如果你想这样做,你必须返回值并在调用环境中分配它。