我一直在这里读书
https://developer.mozilla.org/en-US/docs/JavaScript/Memory_Management#Allocation_via_function_calls
这些线条让我有点困惑:
var s = "azerty";
var s2 = s.substr(0, 3); // s2 is a new string
// Since strings are immutable value, JavaScript may decide
// to not allocate memory, but just store the [0, 3] range.
所以评论说,JavaScript可能决定不分配内存而只是存储范围[0,3],现在在存储之前不必分配内存?如果没有,正如评论所暗示的那样,究竟发生了什么,以便存储的范围存储在自由空间中,而不是被其他值占用。
答案 0 :(得分:2)
评论意味着s2
不必专门为三个字符"aze"
分配内存。相反,它可以使用已经"azerty"
分配给s
的内存,并记住它自己的长度只有三个字符。
不变性部分也很重要:如果s
不是不可变的,那么它可以决定在不告诉任何人的情况下将其值从"azerty"
更改为"foobar"
,从而间接地改变其值s2
到"foo"
- 这将是灾难性的。
当然这并不意味着不会分配所有的内存;我们仍然需要分配内存来存储可以找到字符串内容的位置,以及字符串的长度。
答案 1 :(得分:2)
评论的内容是为字符串的字符数据分配空间。
当你创建一个新变量时,它自然必须为它分配空间,但这不一定像堆上的新对象,它可能是预分配变量数组中的项。
让两个变量指向相同字符数据的好处是,即使子字符串的长度很长,获取子字符串也会占用很少的内存,缺点是原始字符串只要有任何内容就会保留在内存中使用它的子串。