奇怪的单引号转义

3
var a = "Test \'"
> undefined
var b = "Test '"
> undefined
a === b
> true
a
> "Test '"

enter image description here

是的,我知道这两个字符串相等(在示例代码中展示了出来) - 问题是为什么

为什么转义单引号会产生如此奇怪的结果?请解释一下。

提前感谢您的帮助。

5个回答

3

它们是相等的:

"Test '".length // 6
"Test \'".length // 6

以下表格列出了您可以在JavaScript字符串中使用的特殊字符:\0 \b \f \n \r \t \v \' \" \\ \XXX \xXX \uXXXX \u{XXXXX} 对于未在表格中列出的字符,前导反斜杠将被忽略,但这种用法已被弃用,应避免使用。
简历:
JavaScript将字符串"Test \'"转换为"Test '",然后与另一个"Test '"字符串进行比较。

1
我知道。它在我的问题中有描述。问题是“为什么?” - Vasiliy vvscode Vanchuk
实际上,在 JavaScript 中,\'' 是相同的。反斜杠仅用于在字符串中转义我在问题中列出的特殊字符。 - Ali Mamedov
为什么我使用双引号时,它会将 \ 解析为转义字符? - Vasiliy vvscode Vanchuk

3
我知道这两个字符串是相等的(在示例代码中展示了),问题是为什么。
转义字符永远不是字符串的一部分。它只被解析器用来确定字符串值。
规范解释了如何评估转义序列enter image description here 你可以看到双引号字符串中的转义序列(DoubleStringCharacter)与单引号字符串中的转义序列(SingleStringCharacter)完全相同。两者都评估\ EscapeSequence

为什么我使用双引号时,它会将 \ 解析为转义字符? - Vasiliy vvscode Vanchuk
因为 \ 总是转义字符,无论你使用单引号还是双引号都没有关系。 - Felix Kling

3

字符串中的反斜杠用于转义后面的字符。当在双引号字符串内使用单引号时,不需要转义单引号。

因此,

"Test \'s" === "Test 's"
'Test\"s'  === 'Test"s'

考虑一种情况,你想在一个字符串中包含单引号和双引号。在这种情况下,应该有一些方法来转义内部引号,否则编译器将抛出无效字符串的错误。通过使用反斜杠\,可以转义以下字符,并将其视为普通文字而不是它在上下文中的特殊含义。

"He said, \"My name is something, I stay at my uncle's house.\""

我知道。它在我的问题中有描述。问题是“为什么?” - Vasiliy vvscode Vanchuk
@VasiliyVanchuk 我已经添加了解释。 - Tushar
为什么我使用双引号时,它会将 \ 解析为单引号的转义字符? - Vasiliy vvscode Vanchuk
@VasiliyVanchuk 正如我之前所说的那样,\会转义其后的任何内容,在双引号内部不需要转义单引号。如果您想在字符串中使用反斜杠,则必须转义反斜杠。例如:"Test \' abc"。 - Tushar
如果没有必要,为什么要解析“\”进行转义? - Vasiliy vvscode Vanchuk
@VasiliyVanchuk 反斜杠并不关心后面的字符是否需要转义,它只是这样做,因为它被认为应该这样做。 - Tushar

1

我觉得解释器自动转义了单引号',因为双引号"的存在。所以它会把字符串开头看作",并接受文本中的任何内容。

它期望\是一个转义字符,所以\'将只生成'。 它还期望"结束字符串,所以在字符串主体中允许使用'。因此,在内存中,这两个字符串都将是

Test "

这只是我的猜测,但对我来说似乎是最合理的。a===b是真的,因为两个字符串实际上是相同的。我不知道javascript在后台如何工作,但在大多数编程语言中,a和b实际上都指向内存中的同一对象。


0

你的转义是无用的,所以解释器会忽略它。

var a = "Test \'"
var b = "Test '"

a
> "Test '"
b
> "Test '"

如果你写:

var a = "\a";
a
> "a"

就像我说的,一个意外的转义符会被忽略。


我知道。它在我的问题中有描述。问题是“为什么?” - Vasiliy vvscode Vanchuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接