same code about string.replace get different result in firefox and chrome












3















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.










share|improve this question





























    3















    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.










    share|improve this question



























      3












      3








      3


      1






      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.










      share|improve this question
















      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






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 26 '18 at 3:26









      CertainPerformance

      95.5k165786




      95.5k165786










      asked Nov 26 '18 at 3:21









      Gong YuGong Yu

      183




      183
























          1 Answer
          1






          active

          oldest

          votes


















          0














          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")
          );








          share|improve this answer























            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
            });


            }
            });














            draft saved

            draft discarded


















            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









            0














            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")
            );








            share|improve this answer




























              0














              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")
              );








              share|improve this answer


























                0












                0








                0







                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")
                );








                share|improve this answer













                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")
                );






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 28 '18 at 21:13









                CertainPerformanceCertainPerformance

                95.5k165786




                95.5k165786
































                    draft saved

                    draft discarded




















































                    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.




                    draft saved


                    draft discarded














                    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





















































                    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







                    Popular posts from this blog

                    Wiesbaden

                    Marschland

                    Dieringhausen