один и тот же код для string.replace дает разные результаты в Firefox и Chrome - PullRequest
0 голосов
/ 26 ноября 2018

Недавно я написал простой код javascript, но получил очень странное поведение в Firefox и Chrome, списки кодов ниже:

console.log(
  "sap.ui.widget.Progressbar"
    .replace(/\./g, '/')
    .replace("", "./resources/css/")
);

В Chrome (версия 69.0.3497.100) я получил ожидаемый результат: "./resources/css/sap/ui/widget/Progressbar", но в Firefox (версия 63.0)) Я получаю совершенно другой результат: "sap / ui / widget / Progressbar".

Кто-нибудь может это объяснить?Это ошибка для Firefox?Благодаря.

1 Ответ

0 голосов
/ 29 ноября 2018

Да, это ошибка в 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")
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...