我有这段代码:
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;
那么这里真的发生了什么?
答案 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
的值并将其传递给foo
。 a
和x
之间没有任何关联,而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
,但因为它只是一个函数参数,不会更改调用环境中的引用。如果你想这样做,你必须返回值并在调用环境中分配它。