javascript为什么双重转义点/字符

时间:2013-05-15 11:32:24

标签: javascript

在js中,您必须双击一个点/字符才能获得转义字符。那真是怪了。为什么呢?

JS:

"." == "." // true
"\." == "." // true
"\\." == "." // false

"\a" == "a" // true

在python / php中,它表现得像预期的那样:

"\." == "." // False

在js正则表达式中,它以其他方式工作,多么奇怪:)

"\.".search(/\./)  // no hit
"\\.".search(/\./) // hit

更新

像T.J.克劳德正确地提到正则表达式的例子是错的。 \.正则表达式当然是一个文字点。

正确的例子是:

// Find a literal backslash and a literal dot
"\\.".search(/\\\./) // position 0

// Find a literal Dot
"\\.".search(/\./) // position 1

1 个答案:

答案 0 :(得分:7)

  

在js中,您必须双击一个点/字符才能获得转义字符。

您没有获得“转义字符”。你得到两个字符,一个反斜杠和一个点。点不是“逃脱的”。

序列\.在JavaScript字符串文字中并不特殊。除the ones defined by the spec之外的任何转义序列都会以静默方式删除转义字符。

您的示例"\." == "."true,因为两个文字都定义了相同的字符串,其中一个字符(一个点)。忽略无效转义。

您的示例"\\." == "."false,因为第一个文字定义了一个字符串,其中包含两个字符(反斜杠和一个点),第二个字符串定义了一个只包含一个字符的字符串(一个点) )。

不同语言对无效转义序列的响应方式因语言而异。有些像JavaScript一样,只是忽略了无效的转义。其他人将无效的转义序列视为反斜杠后跟下一个字符,例如,它们默默地转义反斜杠而不是默默地丢弃转义。


重新表达你的正则表达式:

  

在js正则表达式中,它以其他方式工作,多么奇怪:)

"\.".search(/\./)  // no hit    <--- Wrong
"\\.".search(/\./) // hit

这是不正确的,第一个也会命中(“不匹配”的返回值是-1,而不是0)。 "\.".search(/\./)的返回值为0(在索引0处找到匹配,这是有道理的,因为.是第一个字符)。 "\\.".search(/\./)的返回值为1(在索引1处找到匹配,这是有道理的,因为.第二个字符。)

当然,您在正则表达式文字中转义.是完全正确的,因为. 在JavaScript正则表达式中是特殊的。