如我所见,'mars%22%3A%22'
和"mars%22%3A%22"
都是等效的,因为没有任何东西可以逃脱。
我已经创建一个javscript小书签了一段时间了。有一次,将其原样粘贴到Chrome中的书签中时,它停止工作。
经过大量的猜测和检查,我发现了一个解决方案:
一对双引号必须是单引号。为什么?
以下在split()中带有单引号的行在bookmarklet中没有问题:
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不能像Ruby这样的语言来区分单引号和双引号(字符串插值和反斜杠转义序列仅在双引号字符串中起作用)。两种引用在JavaScript中的含义相同。
一个区别是,无论使用哪种引号,都不能在字符串内使用相同的引号,除非您使用反斜杠对其进行转义或对其进行URL编码。
对于您的小书签,浏览器在执行前先取消转义整个javascript:...
URL字符串。您可以使用javascript:alert('foo%22bar')
这样的简单案例进行测试,该案例将提示文本foo"bar
。
因此,在代码运行之前,您的字符串mars%22%3A%22
将转换为mars":"
。由于此字符串中包含双引号,因此只能在单引号字符串内使用。
顺便说一句,我的直觉是正确的,您可能试图在此处解析或处理JSON文本?如果是这样,最好使用JSON.parse()
而不是原始字符串操作。
关于javascript - 如果没有逃脱,单引号/双引号会有所不同吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38579432/