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

Javascript Object.assign()-奇怪的行为需要解释,javascript,object,assign,Javascript,Object,Assign,我有这个密码: 函数边距选项(选项、传递选项){ options=Object.assign(选项,passedOptions); } 设passedOpts={a:true}; 设opts={a:false}; 保证金(OPT、passedOpts); console.log(opts);//按预期返回{a:true}对象。assign设置作为第一个参数的对象的属性;它还返回相同的对象。因此,在第一个示例中,由于您将选项作为第一个参数传递,因此它将使用新的/更新的属性进行更新。在第二个示例中

我有这个密码:

函数边距选项(选项、传递选项){
options=Object.assign(选项,passedOptions);
}
设passedOpts={a:true};
设opts={a:false};
保证金(OPT、passedOpts);

console.log(opts);//按预期返回{a:true}
对象。assign
设置作为第一个参数的对象的属性;它还返回相同的对象。因此,在第一个示例中,由于您将
选项
作为第一个参数传递,因此它将使用新的/更新的属性进行更新。在第二个示例中,您没有将其作为第一个参数传递,它只是要从中读取属性的“源”对象之一,因此不会对其进行更新


如果您感到困惑的是赋值为什么没有更改
opts
,那是因为赋值给参数不会对函数之外的任何内容产生任何影响。例如:

function foo(a) {
    a = 42;
}
var x = 67;
foo(x);
console.log(x); // Still 67
这是因为
foo(x)
读取
x
的值并将其传递到
foo
。除了
a
的值最初来自
x
之外,
a
x
之间没有任何联系


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

对象。assign
将对象的属性设置为第一个参数;它还返回相同的对象。因此,在第一个示例中,由于您将
选项
作为第一个参数传递,因此它将使用新的/更新的属性进行更新。在第二个示例中,您没有将其作为第一个参数传递,它只是要从中读取属性的“源”对象之一,因此不会对其进行更新


如果您感到困惑的是赋值为什么没有更改
opts
,那是因为赋值给参数不会对函数之外的任何内容产生任何影响。例如:

function foo(a) {
    a = 42;
}
var x = 67;
foo(x);
console.log(x); // Still 67
这是因为
foo(x)
读取
x
的值并将其传递到
foo
。除了
a
的值最初来自
x
之外,
a
x
之间没有任何联系

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

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

options = Object.assign(options, passedOptions); 
您的代码之所以有效,是因为
options
是第一个参数。请注意,返回到
options
参数的赋值没有效果,或者至少没有有用的效果。它将分配
对象的返回值。将
分配给
选项
变量,但这是它已经拥有的值

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

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

options = Object.assign(options, passedOptions); 
您的代码之所以有效,是因为
options
是第一个参数。请注意,返回到
options
参数的赋值没有效果,或者至少没有有用的效果。它将分配
对象的返回值。将
分配给
选项
变量,但这是它已经拥有的值


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

formal\u parameter=
在函数中不会以任何方式影响实际参数
formal\u parameter=
在函数中不会以任何方式影响实际参数