Javascript 字符串中的单转义和双转义(反斜杠)有什么区别?

What is the difference between a single and double escape (backslash) in Javascript string?

尝试回答此问题后 post

Another SO post

我注意到这个

Function('return "\101\40\171\145\154\154\157\167\40\142\165\164\164\157\156\56"')()

Function('return "1154477254476"')()

两个 return 相同的字符串 - "A yellow button."

关于我在上面 link 提出的问题,JS 代码片段是 运行 在标记中。

我过去也注意到,在处理某些 JSON 字符串时,需要 '\' 而不是 '\'

什么时候需要? 为什么有必要? 如果不需要,那为什么要这样做?

链接和补充阅读对我有帮助。

更新: 可能是我问这个问题的信息不够

我明白何时以及为什么需要转义。

我想知道的有两件事

在上面的link中,代码有两个作用;像这样一个嵌套在另一个中

Function(
  Function(
    'return\'\141\75\160\162\157\155\160\164\50\47\105\156\164\162\145\172\40\154\145\40\155\157\164\40\144\145\40\160\141\163\163\145\47\51\73\151\146\50\141\75\75\47\164\157\164\157\61\62\63\154\157\154\47\51\173\141\154\145\162\164\50\47\142\162\141\166\157\47\51\73\175\145\154\163\145\173\141\154\145\162\164\50\47\146\141\151\154\56\56\56\47\51\73\175\'')())()

这个脚本和这个脚本一样有效

Function(
  Function('return "10275045642524557445013351614747474314524221675543531452461145"')())()

为什么,如果两个脚本都有效,那么需要“\\”而不是“\”吗?我在这里遗漏了什么吗?

第二个问题是,

是否存在需要“\\”而不是“\”的基本情况?

我认为 sventschui 正在实现,但还没有完全实现。

因为您嵌套了两个字符串,这两个示例 return 相同的字符串。


'return "\101\40\171\145\154\154\157\167\40\142\165\164\164\157\156\56"'

计算为

return "1154477254476"

计算结果为

A yellow button

'return "1154477254476"'

计算为

return "A yellow button"

计算结果为

A yellow button

编辑:

使用双重转义是因为当 \000 将计算为 \ 时,下面的示例会搞砸:

'return "[=16=]0[=16=]0"'

计算为

return "\"

计算结果为

\

'return "\000\000"'

计算为

return "[=20=]0[=20=]0"

计算结果为

\

我觉得的思路是对的,我换个方式解释一下吧

当你定义一个字符串时使用 str1='"\101\40\171\145\154\154\157\167\40\142\165\164\164\157\156\56"'

\是转义序列,内存中的实际字符串是(包括它周围的引号)"1154477254476"


当您将字符串定义为 str2="1154477254476"

1,</code>,... 是转义序列,内存中的实际字符串是(包括它周围的引号)<code>"A yellow button"


当您创建 Function() 时,它会重新评估字符串(如 eval),对于第一种情况,str1 现在它会处理 1</code> 作为转义序列,返回的字符串是 <code>A yellow button,没有引号。

当你对第二个字符串做同样的事情时,没有转义序列,只有普通字符,所以字符串没有改变(除了它周围的引号)

var str1 = '"\101"'; // "1"
var str2 = '"1"'; //  "A"

var str1Evaled = eval(str1); // 1 is the escape sequence, outputs A
var str2Evaled = eval(str2); // No escape sequence, a raw A

console.log({str1, str2, str1Evaled, str2Evaled});

//  Object {str1: ""1"", str2: ""A"", str1Evaled: "A", str2Evaled: "A"}