特别是在V8/Node.js中,当您将primitive type(字符串、数字、布尔值)推入数组时,它是将字符串clone,还是存储引用?
我知道你不能在这样做的同时改变字符串:
let array = []
let x = 'foo'
array.push(x)
x = 'bar'
console.log(array) //=> ['foo']
但是,如果我这样做,是否会多次复制字符串(从而增加内存占用)?
let array = []
let x = 'foo'
array.push(x)
array.push(x)
array.push(x)
...
同样的问题也适用于对象键,如果我这样做,它会克隆字符串吗?
let object = {}
let x = 'foo'
object.a = x
object.b = x
object.c = x
我四处寻找了一下,但没有找到这个问题的直接答案.
Do objects pushed into an array in javascript deep or shallow copy?个
对象和数组作为指向原始对象的指针推送.Built-in primitive types like numbers or booleans are pushed as a copy.个
但我不确定这是否正确(它没有备份).我必须运行一系列彻底的测试,才能真正判断并查看当我推入数组时内存是否增加.我不太确定实现这一点的最简单方法,所以也许V8工程师或其他精通编译器理论的人知道这是如何实现的.
我想用Buffer.byteLength(text, 'utf8')
来计算添加到trie中的每个字符串的大小,然后跟踪trie的大致大小(将其中使用的字符串大小相加,并粗略估计用于存储n个对象属性和x长度数组的字节).所以第一步是理解,will my string get copied when I push it into multiple places, or will the same reference be carried around in each place?
我希望这个博客是不正确的,它推送一个引用,只是一旦它被发送到另一个函数,你就不能修改variable.但字符串仍然是一个引用,直到您try 更改变量,就像这样.