gpt4 book ai didi

javascript - 将新值分配给传递给 JavaScript 函数的对象

转载 作者:数据小太阳 更新时间:2023-10-29 03:53:36 24 4
gpt4 key购买 nike

我是 JavaScript 的新手(虽然有 C++ 经验),今天,我写了这样的东西:

function foo(bar) {
bar = "something else";
}
var x = "blah";
foo(x);
alert(x); // Alerts with "blah", but I was expecting it to alert with "something else"

这让我很困惑,因为我一直在观看 Douglas Crockford 的一些 JavaScript 视频,并记得他说过类似“JavaScript 总是通过引用传递”这样的话。

我可以解释这种情况的方式是 JavaScript 将引用传递给对象,但这些引用被复制了。这意味着在 foo 函数中,我正在为 bar 分配一个新的引用,然后它超出范围,留下引用 x没有动过。基本上我们从:

x   ---->"blah"

然后当 foo 被调用时,bar 引用相同的数据:

x   ---->"blah"
bar -----^

所以当“其他东西”被分配给 bar 时,会发生这种情况:

x   ---->"blah"
bar ---->"something else"

这是 JavaScript 中实际发生的事情的准确模型,还是我遗漏了其他东西?

作为一个额外的问题,有什么办法可以说,更改此变量引用的数据?这种情况经常出现,还是可以轻松避免?

编辑:

道格拉斯克罗克福德在 video I watched说“对象总是通过引用传递,而不是通过值传递”,这是正确的,但是函数的参数是通过值传递的,只是引用是通过值传递的。

最佳答案

你的解释是正确的。

首先,您有一个名为 x 的变量,它是一个字符串对象的引用。假设内存是 0x100。 x 指向 0x100,其中包含字节 blah:

var x = "blah"; // x is 0x100 which references a string in memory

接下来,将 0x100 传递给函数 foo:

function foo(bar) {
bar = "something else";
}

由于 JavaScript 中的所有内容都是按值传递的,甚至是引用,JavaScript 会在内存中复制此引用,现在在该函数中称为 bar: p>

foo(x); // Copies the value of x (a reference) to bar

此时,我们有两个独立的变量。 xbar。两者碰巧具有相同的值,0x100。因此,如果您要更改其中任何一个引用的对象的属性,它会同时影响 xbar

但是,所做的是将 bar 指定为指向其他内容:

bar = "something else"; // Now references some other string we just created

现在,bar 被重新分配以引用我们刚刚为其分配内存的新字符串。 bar 不再具有 0x100 的值,它现在具有某个其他地址的值(比如 0x500)。 x 当然 仍然 的值为 0x100 因为 bar 只是 的副本> x,而不是对 x 的引用。

因此,当您:

alert(x);

您仍然会得到原始值,因为这是 x 指向的值。

第二个问题:

is there any way to say, change the data referenced by this variable? Is this a situation that comes up often, or can it be easily avoided?

是的,只是将它包裹在另一个对象中。例如:

var x = {Value: "blah"};
foo(x);

现在,我们有一个对象的引用,该对象具有名为 Value 的属性,其中包含对内存中某处字符串的引用。

foo中,我们可以做:

bar.Value = "something else";

这会影响 xValue 属性,因为 barx 都引用了同一个对象,而且您从未更改过其中任何一个的值。

换句话说,您不能重新分配您传递给函数的引用,因为您只是重新分配一个副本。但是,您可以更改被引用对象的属性,因为该引用的其他副本都指向您正在更改的数据。

关于javascript - 将新值分配给传递给 JavaScript 函数的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21917422/

24 4 0
文章推荐: javascript - 检查 ArrayBufferView 的实例?
文章推荐: c# - 如何使用反射获取私有(private)字段的值?
文章推荐: c# - 如何使用 List 的 IndexOf() 方法