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=
在函数中不会以任何方式影响实际参数