2

我想知道(希望确认一下)JavaScript 是否以写时复制的方式管理其变量。这很重要,因为我最终可能会处理可能很大的字符串,其中不少。

var a, b;

a = $(".foo").html();
b = a;

b深拷贝还是写时拷贝?我的代码将从写时复制中受益匪浅,因为在某些情况下我设置b为不同的值(即在大多数情况下我复制a,在其他情况下我设置为,例如,"on""off"。但是,它没有得到稍后修改。)

4

2 回答 2

2

JavaScript 字符串是否使用写时复制?不,因为您不能写入 JavaScript 字符串,所以它们是不可变的。

但是,是的,他们正在有效地使用这种优化。当你b=a在你的例子中分配时,b得到一个指向同一个存储的a指针。即它非常快。如果您这样做b = b.replace('x','y'),则会创建一个新字符串并b指向它,同时a继续指向原始字符串。

请参阅 JavaScript The Definitive Guide 中关于字符串的第 11.2.2 节。

顺便说一句,如果您真的感兴趣,这里是 V8 源代码:

https://github.com/v8/v8/blob/master/src/objects/string.h

https://github.com/v8/v8/blob/master/src/objects/string.cc

以及为什么它如此复杂的一些解释(即大字符串有时存储为一堆小字符串,仅在必要时重新组合;似乎也对 ascii 字符串进行了优化)https://gist。 github.com/mraleph/3397008

于 2019-10-09T08:18:04.807 回答
0

根据我对 JavaScript 的了解a === b,但它们没有关联。如果你改变一个,另一个不会改变。

字符串是本机类型,因此按值引用(和复制),而不是引用。

于 2014-03-18T18:34:07.767 回答