gpt4 book ai didi

javascript - Javascript 子串是虚拟的吗?

转载 作者:可可西里 更新时间:2023-11-01 01:42:23 26 4
gpt4 key购买 nike

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

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

我知道这取决于实现,ECMAScript 标准(可能)没有定义字符串实现的底层内容。但我想从内部足够了解 V8 或 SpiderMonkey 的专家那里了解这一点。

谢谢

最佳答案

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

  1. ASCII
  2. UTF-16
  3. 多个字符串的连接
  4. 另一个字符串的切片

Adventures in the land of substrings and RegExps有很好的解释和插图。

因此,它不必复制字符串;它只需要开始和结束标记到另一个字符串。

SpiderMonkey 做同样的事情。 (请参阅 Large substrings ~9000x faster in Firefox than Chrome: why? ... 尽管 Chrome 的答案已过时。)

这可以带来真正的速度提升,但有时这是不可取的,因为它会导致小字符串占用较大父字符串的内存 ( V8 bug report )

关于javascript - Javascript 子串是虚拟的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20536662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com