Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript子字符串是虚拟的吗?_Javascript_String_Substring_V8_Spidermonkey - Fatal编程技术网

Javascript子字符串是虚拟的吗?

Javascript子字符串是虚拟的吗?,javascript,string,substring,v8,spidermonkey,Javascript,String,Substring,V8,Spidermonkey,如果我们有一个巨大的字符串,名为str1,比如500万个字符长,然后str2=str1.substr(5555100),那么str2的长度为100个字符,是从5555(或任何其他随机选择的位置)开始的str1的子字符串 JavaScript如何在内部存储str2?字符串内容是否已复制,或者新字符串是虚拟的,并且只存储对原始字符串的引用以及位置和大小的值 我知道这取决于实现,ECMAScript标准(可能)并没有定义字符串实现背后的内容。但我想从一些熟悉V8或SpiderMonkey的专家那里了解

如果我们有一个巨大的字符串,名为
str1
,比如500万个字符长,然后
str2=str1.substr(5555100)
,那么
str2
的长度为100个字符,是从5555(或任何其他随机选择的位置)开始的
str1
的子字符串

JavaScript如何在内部存储str2?字符串内容是否已复制,或者新字符串是虚拟的,并且只存储对原始字符串的引用以及位置和大小的值

我知道这取决于实现,ECMAScript标准(可能)并没有定义字符串实现背后的内容。但我想从一些熟悉V8或SpiderMonkey的专家那里了解一些情况,以澄清这一点


谢谢

字符串是,对它们的任何操作都会创建新字符串
str2
是一个全新的字符串,包含从
str1
复制的数据

字符串是,对它们的任何操作都会创建新字符串
str2
是一个全新的字符串,包含从
str1
复制的数据

AFAIK V8有四种字符串表示形式:

  • ASCII码
  • UTF-16
  • 多个字符串的串联
  • 另一条线的切片
  • 因此,它不必复制字符串;它只需要将开始和结束标记添加到另一个字符串

    SpiderMonkey也做同样的事情。(请参阅……尽管Chrome的答案已经过时。)


    这可以提高实际速度,但有时这是不可取的,因为它会导致小字符串保留在较大父字符串的内存中()

    AFAIK V8有四种字符串表示形式:

  • ASCII码
  • UTF-16
  • 多个字符串的串联
  • 另一条线的切片
  • 因此,它不必复制字符串;它只需要将开始和结束标记添加到另一个字符串

    SpiderMonkey也做同样的事情。(请参阅……尽管Chrome的答案已经过时。)


    这可以提高实际速度,但有时这是不可取的,因为它会导致小字符串保留在较大父字符串的内存中()

    我的这篇老博文解释了这一点,以及其他一些字符串表示形式:


    搜索“依赖字符串”。我想我知道你可能在问什么:它们有时可能是有问题的东西,因为如果没有对原始的引用,你可以保留一个巨大的字符串,以便保留一个实际上在语义上可以访问的小的子字符串。实现可以做一些事情来缓解这个问题,比如在GC生成的基础上记录信息,查看是否存在这种依赖于一个字符串的实体,并将它们折叠到最小大小,但据我所知,没有这样做。(基本上,通过这种方法,您正在GC扫描时恢复
    运行时\u refcount==1
    样式信息。)

    我的这篇老博文解释了这一点,以及其他一些字符串表示形式:


    搜索“依赖字符串”。我想我知道你可能在问什么:它们有时可能是有问题的东西,因为如果没有对原始的引用,你可以保留一个巨大的字符串,以便保留一个实际上在语义上可以访问的小的子字符串。实现可以做一些事情来缓解这个问题,比如在GC生成的基础上记录信息,查看是否存在这种依赖于一个字符串的实体,并将它们折叠到最小大小,但据我所知,没有这样做。(基本上,使用这种方法,您在GC扫描时恢复
    运行时\u refcount==1
    样式信息。)

    由于切片部分也是不可变的,但是,您不需要复制数据,因为用户无法尝试更改它。此外,即使在可变字符串的情况下,理论上也可以采用写时拷贝的方法,将实际拷贝延迟到更改完成的时间(以及如果更改完成)。但是,由于切片部分也是不可变的,您不需要复制数据,因为用户无法尝试更改它。此外,即使在可变字符串的情况下,理论上也可以采用写时拷贝的方法,将实际拷贝延迟到更改完成的时间(以及是否完成)。