Да, это ошибка в Spidermonkey.Это было сообщено и будет фиксированным в FF 65, если все пойдет хорошо.(Ошибка не возникает на любом другом движке Javascript)
Проблема заключается в том, что промежуточные строки (например, те, которые возникают в результате вызова String.prototype.replace
для строкового литерала) длиной более 24 символовпредставлены в Spidermonkey как веревки , в то время как длина этих 23 или менее символов не веревки.Spidermonkey неправильно заменил веревки при вызове с replace(''
.(см. функцию BuildFlatRopeReplacement
в js/src/builtin/String.cpp
)
Вы можете воспроизвести проблему, вызвав .replace
и заменив хотя бы один символ в строке из 24+ символов, а затем вызвав .replace
снова с пустой строкой:
// Run on FF 64 or lower to reproduce:
// Second replacement at the beginning of the string fails:
console.log(
"a".repeat(24).replace('a', 'b').replace("", "foo")
);
// Works as expected:
console.log(
"a".repeat(23).replace('a', 'b').replace("", "foo")
);