常见的 JavaScript 引擎,例如 V8 和 WebKit 的 JavaScriptCore,是否对 JavaScript 字符串使用字符串实习?或者他们实际上是否在内存中保留了多个相同字符串的实例?
常见的 JavaScript 实现是否使用字符串实习?
IT技术
javascript
programming-languages
webkit
v8
string-interning
2021-01-10 23:01:00
3个回答
是的。通常,JS 源代码中的任何文字字符串、标识符或其他常量字符串都是 intern。然而,实现细节(例如实习的确切内容)以及实习发生的时间各不相同。
请注意,字符串值与字符串对象不同,但字符串对象不会被实习,因为这从根本上是不正确的行为。
http://jsperf.com/strinterning
在 Chrome 中是,在 Aurora 15 和 FF 13 中不是!比较两个字符串比在 Firefox 中比较两个指针慢 85%。然而,它在 Chrome 中的速度相同,这表明它正在比较两个指针。
也许 Mozilla 的 JS 引擎团队应该检查他们的代码......
简短回答:有时是,有时不是。
我也偶然发现了同样的问题,并仔细研究了一下。似乎实习通常是针对以相同方式生成的字符串文字完成的(例如,始终将相同的字符串分配给同一循环中的变量),但我也能够创建一个示例,该示例导致创建两个相同的字符串有两个不同的参考:
如您所见,每个字符串存储两次,具有不同的引用。
这是我用来生成重复字符串的代码:
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 次,因此仍然对在 中创建的串联字符串进行了字符串实习外循环。
其它你可能感兴趣的问题