在v8 / Node.js中,特别是当你将一个原始类型(字符串、数字、布尔值)推入数组时,它是克隆字符串还是存储引用?
我知道你不能这样做并改变字符串:
但是如果我这样做,会不会多次复制字符串(从而增加内存占用)?
同样的问题也适用于对象键,如果我这样做,它会克隆字符串吗?
我在周围搜索了一下,但没有找到这个问题的直接答案。 在JavaScript中,将对象推入数组中是深拷贝还是浅拷贝? 这篇博客文章说:
我想使用
我知道你不能这样做并改变字符串:
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
我在周围搜索了一下,但没有找到这个问题的直接答案。 在JavaScript中,将对象推入数组中是深拷贝还是浅拷贝? 这篇博客文章说:
但我不确定这是否正确(没有备份)。我需要运行一系列彻底的测试来真正检查并确定在将元素推入数组时内存是否增长。我不太确定最简单的方法是什么,也许v8工程师或其他精通编译器理论的人知道这是如何实现的。对象和数组被推入时是指向原始对象的指针。内置的原始类型,如数字或布尔值,被推入时是拷贝。
我想使用
Buffer.byteLength(text, 'utf8')
来计算我添加到trie中的每个字符串的大小,然后跟踪trie的大致大小(将其使用的字符串大小相加,并粗略估计用于存储n个对象属性和x长度数组的字节数)。所以第一步是理解,当我将字符串推入多个位置时,我的字符串会被复制,还是同一个引用会在每个位置传递?
我希望那篇博客是错误的,并且它推送的是一个引用,只是当你将一个变量发送到另一个函数后,就无法修改它。但是字符串仍然是一个引用,直到你尝试改变变量,类似于这样的情况。