Firefox работает быстро, потому что он использует нечто, называемое Веревки ( Веревки: альтернатива строкам ).В принципе, веревка - это просто DAG, где каждый узел является строкой.
Так, например, если вы сделаете a = 'abc'.concat('def')
, вновь созданный объект будет выглядеть следующим образом. Конечно, это не совсем так, как это выглядит в памяти, потому что вам все еще нужно иметь поле для типа строки, длины и, возможно, других.
a = {
nodeA: 'abc',
nodeB: 'def'
}
И b = a.concat('123')
b = {
nodeA: a, /* {
nodeA: 'abc',
nodeB: 'def'
} */
nodeB: '123'
}
Таким образом, в простейшем случае виртуальная машина почти не выполняет работы.Единственная проблема заключается в том, что это немного замедляет другие операции с полученной строкой.Также это, конечно, уменьшает накладные расходы памяти.
С другой стороны, ['abc', 'def'].join('')
обычно просто выделяет память для размещения новой строки в памяти.(Может быть, это должно быть оптимизировано)