【问题标题】:Do single/double quotes make a difference if nothing is escaped?如果没有转义,单引号/双引号会有所不同吗?
【发布时间】:2016-07-26 00:39:09
【问题描述】:

在我看来,'mars%22%3A%22'"mars%22%3A%22" 是等价的,因为没有任何东西被转义。

我创建一个 javscript 小书签已经有一段时间了。有一次,它在按原样粘贴到 Chrome 中的书签时停止工作。

经过多次猜测和检查,我发现了一个解决方案:
一对双引号必须是单引号。为什么?

以下在 split() 中带有单引号的行不会导致小书签出现问题:

loadDoc("/page1/" + aArray[i].href.split('mars%22%3A%22')[1].slice(0,7),i);

下面所有双引号的行将导致书签根本不运行:

loadDoc("/page1/" + aArray[i].href.split("mars%22%3A%22")[1].slice(0,7),i);

控制台中没有显示错误。

请注意,如果直接粘贴到 javascript 控制台,双引号版本将运行良好!

我不明白什么?

【问题讨论】:

    标签: javascript string google-chrome quotes bookmarklet


    【解决方案1】:

    JavaScript 不像 Ruby 那样区分单引号和双引号(其中字符串插值和反斜杠转义序列仅适用于双引号字符串)。这两种引号在 JavaScript 中的含义相同。

    不同之处在于,无论您使用哪种类型的引号,都不能在字符串中使用相同的引号,除非您使用反斜杠对其进行转义或对其进行 URL 编码。

    对于您的书签,浏览器会在执行之前将整个javascript:... URL 字符串转义。您可以使用javascript:alert('foo%22bar') 之类的简单案例进行测试,该案例将提醒文本foo"bar

    因此,在代码运行之前,您的字符串 mars%22%3A%22 将转换为 mars":"。由于该字符串中包含双引号,因此只能在单引号字符串中使用。

    顺便说一句,我的预感是否正确,您可能正在尝试在这里解析或操作 JSON 文本?如果是,最好使用JSON.parse() 而不是原始字符串操作。

    【讨论】:

      【解决方案2】:

      mars%22%3A%22 是一个编码字符串。因此,当它在编译之前解码时,它会像 mars":"。所以下面的行

      loadDoc("/page1/" + aArray[i].href.split("mars%22%3A%22")[1].slice(0,7),i);
      

      根据 "mars":"" 拆分 href,以及下面的行

      loadDoc("/page1/" + aArray[i].href.split('mars%22%3A%22')[1].slice(0,7),i);
      

      根据 'mars":"' 拆分 href,这会有所不同。

      【讨论】:

        【解决方案3】:

        在 Javascript 中,'...'"..."完全相同,前提是内容不包含单引号或双引号。

        如果有区别,那是代码中的错误,因为它显然只正确处理了双引号的转义。这不是代码本身的问题...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-08
          • 2013-04-15
          • 2011-06-13
          • 2013-06-30
          • 1970-01-01
          相关资源
          最近更新 更多