我想知道(希望确认一下)JavaScript 是否以写时复制的方式管理其变量。这很重要,因为我最终可能会处理可能很大的字符串,其中不少。
var a, b;
a = $(".foo").html();
b = a;
是b
深拷贝还是写时拷贝?我的代码将从写时复制中受益匪浅,因为在某些情况下我设置b
为不同的值(即在大多数情况下我复制a
,在其他情况下我设置为,例如,"on"
或"off"
。但是,它没有得到稍后修改。)
我想知道(希望确认一下)JavaScript 是否以写时复制的方式管理其变量。这很重要,因为我最终可能会处理可能很大的字符串,其中不少。
var a, b;
a = $(".foo").html();
b = a;
是b
深拷贝还是写时拷贝?我的代码将从写时复制中受益匪浅,因为在某些情况下我设置b
为不同的值(即在大多数情况下我复制a
,在其他情况下我设置为,例如,"on"
或"off"
。但是,它没有得到稍后修改。)
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
根据我对 JavaScript 的了解a === b
,但它们没有关联。如果你改变一个,另一个不会改变。
字符串是本机类型,因此按值引用(和复制),而不是引用。