Javascript字符串中的单转义和双转义(反斜杠)有什么区别?
在尝试回答此帖子的问题后 我注意到这一点Javascript字符串中的单转义和双转义(反斜杠)有什么区别?,javascript,string,function,escaping,ascii,Javascript,String,Function,Escaping,Ascii,在尝试回答此帖子的问题后 我注意到这一点 Function('return "\\101\\40\\171\\145\\154\\154\\157\\167\\40\\142\\165\\164\\164\\157\\156\\56"')() 或 两者都返回相同的字符串-“黄色按钮” 关于我上面链接的问题,JS代码片段是在标记中运行的 我过去也注意到,在处理一些JSON字符串时,需要使用“\”而不是“\” 什么时候有必要? 为什么有必要? 如果没有必要,为什么要这样做 链接和附加阅读对我很有
Function('return "\\101\\40\\171\\145\\154\\154\\157\\167\\40\\142\\165\\164\\164\\157\\156\\56"')()
或
两者都返回相同的字符串-“黄色按钮”
关于我上面链接的问题,JS代码片段是在标记中运行的
我过去也注意到,在处理一些JSON字符串时,需要使用“\”而不是“\”
什么时候有必要?
为什么有必要?
如果没有必要,为什么要这样做
链接和附加阅读对我很有帮助
更新:
也许我问这个问题时没有提供足够的信息
我明白什么时候以及为什么需要逃跑
我想知道的是两件事
在上面的链接中,代码有两个功能;一个嵌套在另一个中,就像这样
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 "\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"')())()
为什么,如果两个脚本都能工作,那么需要“\”而不是“\”?这里有我遗漏的东西吗
第二个问题是
在“\”之上需要“\”时,是否存在基本情况
我认为sventschui已经达到了目的,但还没有达到目的。因为您嵌套了两个字符串,两个示例都返回相同的字符串
评估为
return "\101\40\171\145\154\154\157\167\40\142\165\164\164\157\156\56"
评估结果是什么
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
评估为
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
评估结果是什么
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
编辑: 之所以使用双转义,是因为当\000的计算结果为\时,以下示例会出错:
'return "\000\000"'
评估为
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
评估结果是什么
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
评估为
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
评估结果是什么
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
因为嵌套了两个字符串,所以两个示例都返回相同的字符串
评估为
return "\101\40\171\145\154\154\157\167\40\142\165\164\164\157\156\56"
评估结果是什么
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
评估为
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
评估结果是什么
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
编辑: 之所以使用双转义,是因为当\000的计算结果为\时,以下示例会出错:
'return "\000\000"'
评估为
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
评估结果是什么
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
评估为
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
评估结果是什么
A yellow button
return "A yellow button"
A yellow button
return "\\"
\
return "\000\000"
\\
我认为他有正确的想法,让我试着用另一种方式来解释
当您使用
str1='“\\101\\40\\171\\145\\154\\154\\157\\167\\40\\142\\165\\164\\164\\157\\156\\56”
\\
是转义序列,内存中的实际字符串是(包括其周围的引号)“\101\40\171\145\154\154\157\167\40\142\165\164\164\157\156\56”
当您将字符串定义为
str2=“\101\40\171\145\154\154\157\167\40\142\165\164\164\157\156\56”
\101
,\40
,。。。是转义序列,内存中的实际字符串是(包括其周围的引号)“黄色按钮”
创建
函数()
时,它会重新计算字符串(如eval
),对于第一种情况,str1
,现在它将\101
,\40
视为转义序列,返回的字符串是一个黄色按钮,周围没有引号
当您对第二个字符串执行相同的操作时,没有转义序列,只有常规字符,因此该字符串保持不变(除了它周围的引号)
var str1='“\\101”;//"\101"
变量str2=“\101”;//“A”
var str1Evaled=eval(str1);//\101是转义序列,输出A
var str2Evaled=eval(str2);//没有转义序列,一个原始的
log({str1,str2,str1Evaled,str2Evaled});
//对象{str1:“\101”,str2:“A”,str1Evaled:“A”,str2Evaled:“A”}
我认为这个想法是正确的,让我试着用另一种方式解释它
当您使用
str1='“\\101\\40\\171\\145\\154\\154\\157\\167\\40\\142\\165\\164\\164\\157\\156\\56”
\\
是转义序列,内存中的实际字符串是(包括其周围的引号)“\101\40\171\145\154\154\157\167\40\142\165\164\164\157\156\56”
当您将字符串定义为str2=“\101\40\171\145\154\154\157\167\40\142\165\164\164\157\156\56”
\101
,\40
,。。。是转义序列,内存中的实际字符串是(包括其周围的引号)“黄色按钮”
创建函数()
时,它会重新计算字符串(如eval
),对于第一种情况,str1
,现在它将\101
,\40
视为转义序列,返回的字符串是一个黄色按钮,周围没有引号
当您对第二个字符串执行相同的操作时,没有转义序列,只有常规字符,因此该字符串保持不变(除了它周围的引号)
var str1='“\\101”;//"\101"
变量str2=“\101”;//“A”
var str1Evaled=eval(str1);//\101是转义序列,输出A
var str2Evaled=eval(str2);//没有转义序列,一个原始的
log({str1,str2,str1Evaled,str2Evaled});
//对象{str1:“\101”,str2:“A”,str1Evaled:“A”,str2Evaled:“A”}
你能在我提供的链接上取一个峰值吗?如果我将函数和用户嵌套为单或双,我仍然会得到相同的结果。我理解角色转义,我只是不太明白为什么一个转义仍然有效的人会这么做。此外,上述两个函数返回相同的结果。请参阅我的更新,当双转义与单转义不同时,您可以在我提供的链接处获取峰值吗?如果我将函数和用户嵌套为单或双,我仍然会得到相同的结果。我理解角色转义,我只是不太明白为什么一个转义仍然有效的人会这么做。此外,上述两个函数返回相同的结果。请参阅我的更新,当双转义不同于单转义时。对于某些字符,您将需要双转义,最突出的是\
和”
对于某些字符,您将需要双转义