same code about string.replace get different result in firefox and chrome
Recently I wrote a simple javascript code, but got a very weird behavior in Firefox and Chrome, code lists bellow:
console.log(
"sap.ui.widget.Progressbar"
.replace(/./g, '/')
.replace("", "./resources/css/")
);
In Chrome (version 69.0.3497.100) I got expected result: "./resources/css/sap/ui/widget/Progressbar", but in Firefox (version 63.0) I get a totally different result: "sap/ui/widget/Progressbar".
Can some explain this? Is it a bug for Firefox? Thanks.
javascript google-chrome firefox replace
add a comment |
Recently I wrote a simple javascript code, but got a very weird behavior in Firefox and Chrome, code lists bellow:
console.log(
"sap.ui.widget.Progressbar"
.replace(/./g, '/')
.replace("", "./resources/css/")
);
In Chrome (version 69.0.3497.100) I got expected result: "./resources/css/sap/ui/widget/Progressbar", but in Firefox (version 63.0) I get a totally different result: "sap/ui/widget/Progressbar".
Can some explain this? Is it a bug for Firefox? Thanks.
javascript google-chrome firefox replace
add a comment |
Recently I wrote a simple javascript code, but got a very weird behavior in Firefox and Chrome, code lists bellow:
console.log(
"sap.ui.widget.Progressbar"
.replace(/./g, '/')
.replace("", "./resources/css/")
);
In Chrome (version 69.0.3497.100) I got expected result: "./resources/css/sap/ui/widget/Progressbar", but in Firefox (version 63.0) I get a totally different result: "sap/ui/widget/Progressbar".
Can some explain this? Is it a bug for Firefox? Thanks.
javascript google-chrome firefox replace
Recently I wrote a simple javascript code, but got a very weird behavior in Firefox and Chrome, code lists bellow:
console.log(
"sap.ui.widget.Progressbar"
.replace(/./g, '/')
.replace("", "./resources/css/")
);
In Chrome (version 69.0.3497.100) I got expected result: "./resources/css/sap/ui/widget/Progressbar", but in Firefox (version 63.0) I get a totally different result: "sap/ui/widget/Progressbar".
Can some explain this? Is it a bug for Firefox? Thanks.
console.log(
"sap.ui.widget.Progressbar"
.replace(/./g, '/')
.replace("", "./resources/css/")
);
console.log(
"sap.ui.widget.Progressbar"
.replace(/./g, '/')
.replace("", "./resources/css/")
);
javascript google-chrome firefox replace
javascript google-chrome firefox replace
edited Nov 26 '18 at 3:26
CertainPerformance
91.9k165381
91.9k165381
asked Nov 26 '18 at 3:21
Gong YuGong Yu
183
183
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Yes, this is a bug in Spidermonkey. It has been reported and will be fixed in FF 65 if all goes well. (The bug does not occur on any other Javascript engine)
The problem is that intermediate strings (such as those resulting from calling String.prototype.replace
on a string literal) more than 24 characters long are represented in Spidermonkey as ropes, while those 23 or fewer characters long are not ropes. Spidermonkey did not properly replace ropes when called with replace(''
. (see function BuildFlatRopeReplacement
in js/src/builtin/String.cpp
)
You can reproduce the problem by calling .replace
and replacing at least one character in a 24+ character string, and then calling .replace
again with the empty string:
// 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")
);
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53474386%2fsame-code-about-string-replace-get-different-result-in-firefox-and-chrome%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Yes, this is a bug in Spidermonkey. It has been reported and will be fixed in FF 65 if all goes well. (The bug does not occur on any other Javascript engine)
The problem is that intermediate strings (such as those resulting from calling String.prototype.replace
on a string literal) more than 24 characters long are represented in Spidermonkey as ropes, while those 23 or fewer characters long are not ropes. Spidermonkey did not properly replace ropes when called with replace(''
. (see function BuildFlatRopeReplacement
in js/src/builtin/String.cpp
)
You can reproduce the problem by calling .replace
and replacing at least one character in a 24+ character string, and then calling .replace
again with the empty string:
// 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")
);
add a comment |
Yes, this is a bug in Spidermonkey. It has been reported and will be fixed in FF 65 if all goes well. (The bug does not occur on any other Javascript engine)
The problem is that intermediate strings (such as those resulting from calling String.prototype.replace
on a string literal) more than 24 characters long are represented in Spidermonkey as ropes, while those 23 or fewer characters long are not ropes. Spidermonkey did not properly replace ropes when called with replace(''
. (see function BuildFlatRopeReplacement
in js/src/builtin/String.cpp
)
You can reproduce the problem by calling .replace
and replacing at least one character in a 24+ character string, and then calling .replace
again with the empty string:
// 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")
);
add a comment |
Yes, this is a bug in Spidermonkey. It has been reported and will be fixed in FF 65 if all goes well. (The bug does not occur on any other Javascript engine)
The problem is that intermediate strings (such as those resulting from calling String.prototype.replace
on a string literal) more than 24 characters long are represented in Spidermonkey as ropes, while those 23 or fewer characters long are not ropes. Spidermonkey did not properly replace ropes when called with replace(''
. (see function BuildFlatRopeReplacement
in js/src/builtin/String.cpp
)
You can reproduce the problem by calling .replace
and replacing at least one character in a 24+ character string, and then calling .replace
again with the empty string:
// 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")
);
Yes, this is a bug in Spidermonkey. It has been reported and will be fixed in FF 65 if all goes well. (The bug does not occur on any other Javascript engine)
The problem is that intermediate strings (such as those resulting from calling String.prototype.replace
on a string literal) more than 24 characters long are represented in Spidermonkey as ropes, while those 23 or fewer characters long are not ropes. Spidermonkey did not properly replace ropes when called with replace(''
. (see function BuildFlatRopeReplacement
in js/src/builtin/String.cpp
)
You can reproduce the problem by calling .replace
and replacing at least one character in a 24+ character string, and then calling .replace
again with the empty string:
// 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")
);
// 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")
);
// 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")
);
answered Nov 28 '18 at 21:13
CertainPerformanceCertainPerformance
91.9k165381
91.9k165381
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53474386%2fsame-code-about-string-replace-get-different-result-in-firefox-and-chrome%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown