3

我一直在这里阅读

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

4

2 回答 2

4

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

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

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

于 2013-01-18T15:03:51.733 回答
2

该评论正在谈论为字符串的字符数据分配空间。

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

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

于 2013-01-18T15:18:11.450 回答