如果没有转义,single/double 引号会有所不同吗?

Do single/double quotes make a difference if nothing is escaped?

在我看来,'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 不像 Ruby 这样的语言那样区分单引号和双引号(其中字符串插值和反斜杠转义序列仅在双引号字符串中有效)。 JavaScript.

中两种类型的引号具有相同的含义

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

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

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

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

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,这有所不同。

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

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