如果没有任何转义,单引号或双引号会有区别吗?

时间:2016-07-26 00:39:10

标签: javascript string google-chrome quotes bookmarklet

我认为,'mars%22%3A%22'"mars%22%3A%22"都是等价的,因为没有任何内容被转义。

我一直在创建一个javscript bookmarklet。有一次,当它按原样粘贴到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控制台中,双引号版本将运行正常!

我不理解什么?

3 个答案:

答案 0 :(得分:1)

JavaScript没有像Ruby这样的语言区分单引号和双引号(字符串插值和反斜杠转义序列只能在双引号字符串中工作)。两种类型的引用在JavaScript中具有相同的含义。

唯一的区别是,无论您使用哪种类型的引用,都不能在字符串中使用相同的引用,除非您使用反斜杠或对其进行URL编码来对其进行转义。

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

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

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

答案 1 :(得分:0)

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

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:"'这有所不同。

答案 2 :(得分:0)

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

如果存在差异,那么操作Javascript代码的代码中存在错误,因为显然它只能正确处理双引号的转义。这不是代码本身的问题......