我认为,'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控制台中,双引号版本将运行正常!
我不理解什么?
答案 0 :(得分:1)
JavaScript没有像Ruby这样的语言区分单引号和双引号(字符串插值和反斜杠转义序列只能在双引号字符串中工作)。两种类型的引用在JavaScript中具有相同的含义。
唯一的区别是,无论您使用哪种类型的引用,都不能在字符串中使用相同的引用,除非您使用反斜杠或对其进行URL编码来对其进行转义。
对于书签,浏览器会在执行之前取消整个javascript:...
URL字符串。您可以使用javascript:alert('foo%22bar')
之类的简单案例对此进行测试,该案例会提醒文字foo"bar
。
因此,在代码运行之前,您的字符串mars%22%3A%22
将转换为mars":"
。由于此字符串中包含双引号,因此只能在单引号字符串中使用。
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代码的代码中存在错误,因为显然它只能正确处理双引号的转义。这不是代码本身的问题......