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"}
尝试回答此问题后 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"}