kpo*_*zin 33 javascript programming-languages webkit v8 string-interning
常见的JavaScript引擎(如V8和WebKit的JavaScriptCore)是否使用字符串实习来处理JavaScript字符串?或者他们实际上在内存中保留了多个相同字符串的实例?
oll*_*iej 24
是.通常,JS源中的任何文字字符串,标识符或其他常量字符串都是实体.然而,实施细节(例如,实际上是实施的内容)会有所不同,以及实施时的实施情况.
请注意,字符串值与字符串对象不同,但字符串对象不会被中断,因为这基本上是不正确的行为.
小智 10
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;
}
Run Code Online (Sandbox Code Playgroud)
似乎字符串实习是针对字符串文字完成的,但不是针对连接的字符串值完成的,但正如您在上面看到的,每个连接的字符串只出现两次,而不是 100x2 = 200 次,因此仍然对在外循环。