43

V8やWebKitのJavaScriptCoreなどの一般的なJavaScriptエンジンは、 JavaScript文字列に文字列インターンを使用しますか?それとも、実際には同じ文字列の複数のインスタンスをメモリに保持していますか?

4

3 に答える 3

34

はい。一般に、JSソース内のリテラル文字列、識別子、またはその他の定数文字列はインターンされます。ただし、実装の詳細(たとえば、正確にインターンされるもの)は、インターンがいつ発生するかによって異なります。

ただし、文字列値は文字列オブジェクトと同じではないことに注意してください。ただし、文字列オブジェクトは基本的に正しくない動作になるため、インターンされません。

于 2011-03-11T18:40:51.840 に答える
13

http://jsperf.com/strinterning

Chromeでははい、Aurora15とFF13ではいいえ!2つの文字列の比較は、Firefoxで2つのポインタを比較するよりも85%遅くなります。ただし、Chromeの速度は同じです。これは、2つのポインターを比較していることを示しています。

たぶん、MozillaのJSエンジンチームは彼らのコードをチェックするべきです...

于 2012-07-04T19:02:18.527 に答える
6

簡単な答え:時々はい、時々いいえ。

私も同じ質問に出くわし、少し調べました。インターンは通常、同じ方法で生成された文字列リテラルに対して行われるようです(たとえば、常に同じループ内の変数に同じ文字列を割り当てる)が、2つの同じ文字列が作成される例を作成することもできました2つの異なる参照:

異なる参照IDを持つ同一の文字列値のペアを示すChrome開発ツールのヒープスナップショット

ご覧のとおり、各文字列は2回格納され、参照が異なります。

これは、重複する文字列を生成するために使用したコードです。

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回ではなく、2回しか表示されないため、で作成された連結文字列に対しては文字列インターンが行われます。外側のループ。

于 2018-10-31T11:09:20.950 に答える