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

时间:2015-02-16 20:24:03

标签: javascript string function escaping ascii

试图回答这篇文章后的问题

Another SO post

我注意到了这个

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

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已经到了那里,但还没有。

2 个答案:

答案 0 :(得分:3)

我认为sventschui有正确的想法,让我尝试以不同的方式解释它。

使用时定义字符串  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,...是转义序列,内存中的实际字符串是(包括它周围的引号)"A yellow button"


当您创建Function()时,它会重新评估字符串(例如eval),对于第一种情况,str1现在它会处理\101,{{ 1}}作为转义序列,返回的字符串是\40,没有引号。

当您对第二个字符串执行相同操作时,没有转义序列,只有常规字符,因此字符串不会更改(除了它周围的引号)



A yellow button




答案 1 :(得分:2)

因为您嵌套了两个字符串,所以两个示例都返回相同的字符串。


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

评估为

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

评估为

的内容
A yellow button

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

评估为

return "A yellow button"

评估为

的内容
A yellow button

修改

使用双重转义,因为当\ 000将会评估为\时,以下示例会搞砸:

'return "\000\000"'

评估为

return "\\"

评估为

的内容
\

'return "\\000\\000"'

评估为

return "\000\000"

评估为

的内容
\\