普通JavaScript实现是否使用字符串插入?

普通JavaScript实现是否使用字符串插入?,javascript,programming-languages,webkit,v8,string-interning,Javascript,Programming Languages,Webkit,V8,String Interning,常见的JavaScript引擎,如V8和WebKit的JavaScriptCore,是否使用JavaScript字符串?或者它们实际上在内存中保留了相同字符串的多个实例吗?是。一般来说,JS源代码中的任何文本字符串、标识符或其他常量字符串都是插入的。然而,实施细节(例如,确切的说是什么被实习)以及实习发生的时间各不相同 请注意,字符串值与字符串对象不同,但字符串对象不会被插入,因为这从根本上说是不正确的行为。是。一般来说,JS源代码中的任何文本字符串、标识符或其他常量字符串都是插入的。然而,实施

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

是。一般来说,JS源代码中的任何文本字符串、标识符或其他常量字符串都是插入的。然而,实施细节(例如,确切的说是什么被实习)以及实习发生的时间各不相同


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

是。一般来说,JS源代码中的任何文本字符串、标识符或其他常量字符串都是插入的。然而,实施细节(例如,确切的说是什么被实习)以及实习发生的时间各不相同

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

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

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

在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;
}
const a=[];
常数b=[];

对于(让j=1;j简短回答:有时是,有时不是。

我还偶然发现了同样的问题,并仔细研究了一下。似乎通常对以相同方式生成的字符串文本进行实习(例如,总是将相同的字符串分配给同一循环中的变量),但我也创建了一个示例,该示例使用两个不同的引用创建了两个相同的字符串:

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

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

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;
}
const a=[];
常数b=[];


对于(让j=1;jHi@olliej,你的陈述有任何来源吗?@FelipeSabino正在处理一个主要引擎,并且是ecmascript委员会成员?;)更严重的是,尽管你可以在线查看JavaScriptCore、SpiderMonkey、V8等的源代码。当然,我可以查看任何开放源代码并亲自检查,但存在的原因之一是为了避免这种麻烦,哈哈。这不是怀疑你的知识的问题,只是关心如何帮助开发人员进行研究看来你是一个对这门学科很了解的人,而且你的参考文献也非常有说服力,这可以帮助我更多地了解这门学科。举个例子,你说“一般来说,字符串是被拘留的”,有哪些情况是不被拘留的?等等…@FelipeSabino拘留的逻辑(至少在JSC中)扩展到多个区域。但基本模型与Java类似——常量字符串会自动插入,字符串连接的结果不会自动插入。在Java中,您可以显式强制插入,但JS中不存在这种情况。@olliej您能看一下这里吗?这里也有激烈的争论。谢谢!帮助是真实的非常感谢:)嗨@olliej,你的说法有什么来源吗?@FelipeSabino在一个主要引擎上工作,并且是ecmascript委员会成员?;)更严重的是,你可以在线查看JavaScriptCore、SpiderMonkey、V8等的源代码。当然,我可以查看任何开放源代码并亲自检查,但存在的原因之一是为了避免这种麻烦,哈哈。这不是怀疑你的知识的问题,这只是一个帮助开发者进行研究的问题。看来你是一个对这门学科很了解的人,而且你的参考资料更具说服力,可以帮助我更多地了解这门学科。举个例子,你说“一般来说,字符串是被拘留的”,有哪些情况不是这样的?等等…@FelipeSabino,实习的逻辑(至少在JSC中)分布在多个领域。不过,基本模型与Java类似——常量字符串会自动插入,字符串连接等的结果不会自动插入。在Java中,您可以显式强制实习,但JS中不存在这种情况。@olliej您可以看看这里吗?这里也有一场激烈的争论。谢谢非常感谢您的帮助:)如果您认为这很糟糕,IE9甚至不做指针比较。(.)如果你认为这很糟糕,IE9甚至不做指针比较。(.)这是什么控制台?我不能让左边的箭头出现在字符串上,更奇怪的是,opera/chrome上右边的灰色参考/firefox@towc这是来自chrome开发工具的内存堆快照。@XCS我认为这是不对的:“对于在外部循环中创建的连接字符串,仍然需要进行字符串内部处理”。您没有维护对在外部循环的早期迭代中创建的字符串的引用(每次迭代都会覆盖
a
b
的每个元素),但是如果您对早期连接的字符串进行引用,则