【问题标题】:When you pass a variable to a constructor, will updating that variable update objects? [duplicate]当您将变量传递给构造函数时,更新该变量会更新对象吗? [复制]
【发布时间】:2023-02-03 13:25:12
【问题描述】:

在下面的代码中,我创建了一个名为 Foo 的构造函数,然后创建了一个名为 zzz 的新对象,该对象使用该构造函数并通过引用另一个变量进行调用。

function Foo(bar) {
    this.a = bar;
}
const bar = [10, 10, 10];
const zzz = new Foo(bar);
console.log(zzz.a[0]);
bar[0] = 0;
console.log(zzz.a[0]);

这将打印出 10, 0。我希望 zzz.a 被初始化为 bar 的副本,但我发现更改 bar 也会更改 zzz 对象。有人可以解释为什么会这样吗?

【问题讨论】:

  • zzz.abar 指的是同一个数组。如果需要(浅)拷贝,可以设置this.a = [...bar]
  • 这与将变量传递给任何其他函数没有什么不同。构造函数在这方面并不特殊。

标签: javascript constructor javascript-objects


【解决方案1】:

在 JavaScript 中,原始值参数(undefined、null、boolean、string 和 numbers)作为值的副本而不是引用传递。然而,非原始值在技术上也作为值传递,但出于实用性考虑,我们可以将它们视为引用,因为这些值本身就是引用。

// Pass by value
function passByValue(x) {
    this.a = x;
}
let x = 0;
const passByVal = new passByValue(x);
x = 10;
console.log(passByVal.a); // echos 0

// Pass by reference
function passByReference(x) {
    this.a = x;
}
let y = [0];
const passByRef = new passByReference(y);
y[0] = 6;
console.log(passByRef.a); // echos [6]

【讨论】:

  • 这直接与原始问题中的证据相矛盾。
  • 这有点像 ChatGPT 答案
  • 抱歉,先生们。我已经编辑了我的回复。
猜你喜欢
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 2020-01-16
  • 2020-03-19
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
相关资源
最近更新 更多