JavaScript V8引擎(Chrome,node)在內部使用ConsString結構來表示串聯的字符串。如何拼合V8 ConsString?
將這種結構扁平化爲一個簡單的字符串,我可以在網上查到的一種方法是使用string.charCodeAt(0)
。但是,這似乎不再有效(在Chrome 54上測試)。
是否有另一種方式強制V8扁平化ConsString結構?
我在創建後使用這些字符串的方式將從扁平字符串中受益(例如,減少的內存使用情況)。
JavaScript V8引擎(Chrome,node)在內部使用ConsString結構來表示串聯的字符串。如何拼合V8 ConsString?
將這種結構扁平化爲一個簡單的字符串,我可以在網上查到的一種方法是使用string.charCodeAt(0)
。但是,這似乎不再有效(在Chrome 54上測試)。
是否有另一種方式強制V8扁平化ConsString結構?
我在創建後使用這些字符串的方式將從扁平字符串中受益(例如,減少的內存使用情況)。
Number(str)
仍然展平內部字符串。有一個npm模塊,flatstr,就是這麼做的。這樣你的代碼並不是看起來隨機的調用。見https://www.npmjs.com/package/flatstr。
雖然這看起來似乎使'ConsString'實例更加平坦,但也存在一個潛在的缺點 - 在我的測試中,似乎如果字符串內部存儲爲'InternalizedString',則調用'Number(str)'似乎將其轉換爲簡單的'String'或'OneByteString',這樣可能會增加內存使用量。因此,如果解決方法不會產生更糟糕的結果,則必須分別調查每個用例。 –
我不知道有關節點的內部工作情況,但不會從你的連接字符串中創建一個新的'String'實現你想要的?例如。 'new String(myConcatString)'。還是這會影響性能太多? – watzon
@ChrisW - no,'new String()'不執行展平。相反,它只是圍繞與源相同的內部表示創建一個包裝。 –
啊,我明白了。我想我沒有有用的輸入,然後:/ – watzon