43

常见的 JavaScript 引擎,例如 V8 和 WebKit 的 JavaScriptCore,是否对 JavaScript 字符串使用字符串实习?还是他们实际上在内存中保留了多个相同字符串的实例?

4

3 回答 3

34

是的。通常,JS 源代码中的任何文字字符串、标识符或其他常量字符串都是 intern 的。然而,实施细节(例如,究竟是什么)会有所不同,以及何时发生。

请注意,字符串值与字符串对象不同,但字符串对象不会被实习,因为这从根本上来说是不正确的行为。

于 2011-03-11T18:40:51.840 回答
13

http://jsperf.com/sinterning

在 Chrome 中是,在 Aurora 15 和 FF 13 中没有!在 Firefox 中比较两个字符串比比较两个指针慢 85%。然而,它在 Chrome 中的速度是相同的,这表明它正在比较两个指针。

也许 Mozilla 的 JS 引擎团队应该检查他们的代码......

于 2012-07-04T19:02:18.527 回答
6

简短的回答:有时是,有时不是。

我也偶然发现了同样的问题,并对其进行了一些研究。似乎通常对以相同方式生成的字符串文字进行实习(例如,始终将相同的字符串分配给同一循环中的变量),但我也能够创建一个示例,该示例导致创建了两个相同的字符串有两个不同的参考:

Chrome 开发工具堆快照显示具有不同参考 ID 的相同字符串值对

如您所见,每个字符串存储两次,具有不同的引用。

这是我用来生成重复字符串的代码:

const a = [];
const b = [];

for(let j  =1; j<= 100;++j){
    for(let i = 1; i <= 10000; ++i) a[i] = 'player 1 got 5 points from player 2' + i;
    for(let i = 1; i <= 10000; ++i) b[i] = 'player 1 got 5 points from player 2' + i;
}

似乎字符串实习是针对字符串文字完成的,但不是针对连接的字符串值,但正如您在上面看到的,每个连接的字符串只出现两次,而不是 100x2 = 200 次,所以仍然对创建的连接字符串进行字符串实习外循环。

于 2018-10-31T11:09:20.950 回答