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

Javascript 可以在不分配内存的情况下存储值吗?,javascript,memory-management,garbage-collection,Javascript,Memory Management,Garbage Collection,我一直在这里读书 这些话让我有点困惑: 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],现在存储之

我一直在这里读书

这些话让我有点困惑:

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],现在存储之前不需要分配内存吗?如果不是,正如注释所暗示的那样,会发生什么事情,使存储范围存储在可用空间中,而不是被其他值占用。

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

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


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

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

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


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

注释是指为字符串的字符数据分配空间

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


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

注释是指为字符串的字符数据分配空间

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


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

澄清一下:它确实需要为(内部)字符串分配内存对象描述“取另一个字符串的0-3个字符”。我觉得这不是一种特别聪明的方法。如果原始字符串符合垃圾收集条件(但新字符串不符合条件),会发生什么?@NullUserException:它不会被垃圾收集。只要其中一个字符串变量存在,所有字符串数据都将保留在内存中。@Guffa。现在假设
s1
是非常非常长的字符串,
s2
被定义为这个长字符串的短“范围”。使用此方案,只要
s2
存在,您就无法使用GC
s1
@NullUserException:每种方法都有优点和缺点(例如,使用寿命长的值的短期子字符串,这种方法的成本要低得多)。我敢肯定,JS引擎人员大量使用来自流行应用程序和库的评测信息以及野生代码来决定这样做是否能带来整体好处。为了澄清这一点,它确实需要为描述“使用其他字符串的0-3个字符”的(内部)对象分配内存.我觉得这不是一种特别聪明的做事方式。如果原始字符串符合垃圾收集条件(但新字符串不符合条件),会发生什么?@NullUserException:它不会被垃圾收集。只要其中一个字符串变量存在,所有字符串数据都将保留在内存中。@Guffa。现在假设
s1
是非常非常长的字符串,
s2
被定义为这个长字符串的短“范围”。使用此方案,只要
s2
存在,您就无法使用GC
s1
@NullUserException:每种方法都有优点和缺点(例如,使用寿命长的值的短期子字符串,这种方法的成本要低得多)。我敢肯定,JS引擎人员大量使用流行应用程序和库中的评测信息以及野生代码来决定这样做是否能带来整体好处。