可以在不分配内存的情况下存储值吗?

时间:2013-01-18 15:01:45

标签: javascript memory-management garbage-collection

我一直在这里读书

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],现在在存储之前不必分配内存?如果没有,正如评论所暗示的那样,究竟发生了什么,以便存储的范围存储在自由空间中,而不是被其他值占用。

2 个答案:

答案 0 :(得分:2)

评论意味着s2不必专门为三个字符"aze"分配内存。相反,它可以使用已经"azerty"分配给s的内存,并记住它自己的长度只有三个字符。

不变性部分也很重要:如果s不是不可变的,那么它可以决定在不告诉任何人的情况下将其值从"azerty"更改为"foobar",从而间接地改变其值s2"foo" - 这将是灾难性的。

当然这并不意味着不会分配所有的内存;我们仍然需要分配内存来存储可以找到字符串内容的位置,以及字符串的长度。

答案 1 :(得分:2)

评论的内容是为字符串的字符数据分配空间。

当你创建一个新变量时,它自然必须为它分配空间,但这不一定像堆上的新对象,它可能是预分配变量数组中的项。

让两个变量指向相同字符数据的好处是,即使子字符串的长度很长,获取子字符串也会占用很少的内存,缺点是原始字符串只要有任何内容就会保留在内存中使用它的子串。