【问题标题】:Strange single quote escaping奇怪的单引号转义
【发布时间】:2016-05-04 13:08:57
【问题描述】:
var a = "Test \'"
> undefined
var b = "Test '"
> undefined
a === b
> true
a
> "Test '"

是的。我知道两个刺是相等的(在示例代码中显示) - 问题是 为什么

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

提前谢谢

【问题讨论】:

    标签: javascript escaping


    【解决方案1】:

    我知道两个刺是相等的(在示例代码中显示) - 问题是 为什么

    转义字符是从不字符串的一部分。它仅由解析器用于确定字符串值。

    规范解释how escape sequences are evaluated

    您可以看到双引号字符串 (DoubleStringCharacter) 中的转义序列的计算与单引号字符串 (SingleStringCharacter) 中的转义序列完全相同。两者都评估\ EscapeSequence

    【讨论】:

    • 如果我使用双引号,为什么它会将 \ 解析为转义?
    • 因为 \ 始终是转义字符。使用单引号还是双引号都没有关系。
    【解决方案2】:

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

    因此,

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

    考虑一种情况,您希望在字符串中同时包含单引号和双引号。在这种情况下,应该有某种方法来转义内引号,否则编译器将在无效字符串处抛出错误。通过使用反斜杠\,可以对后面的字符进行转义,并将其视为普通文字,而不是上下文中的特殊含义。

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

    【讨论】:

    • 我知道。它在我的问题中描述。问题是“为什么?”
    • @VasiliyVanchuk 我已经添加了解释
    • 如果我使用双引号,为什么它会将 \ 解析为 sing quote 的转义?
    • @VasiliyVanchuk 正如我已经说过的, \ 正在转义它后面的任何内容,没有必要在双引号内转义单引号。如果你想要字符串中的反斜杠,你也必须转义反斜杠。 "Test \\' abc".
    • 如果不需要 - 为什么它像 esxaping 一样解析 \'?
    【解决方案3】:

    他们是平等的:

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

    下表列出了您可以在 JavaScript 字符串中使用的特殊字符:\0 \b \f \n \r \t \v \' \" \\ \XXX \xXX \uXXXX \u{XXXXX}

    对于表中未列出的字符,前面的反斜杠将被忽略,但这种用法已被弃用,应避免使用。

    简历:

    JavaScript 将字符串 "Test \'" 转换为 "Test '",然后与另一个 "Test '" 字符串进行比较。

    【讨论】:

    • 我知道。它在我的问题中描述。问题是“为什么?”
    • 其实在 JavaScript 中\'' 是一样的。反斜杠仅用于转义字符串中我的问题中列出的特殊字符。
    • 如果我使用双引号,为什么它会将 \ 解析为转义?
    【解决方案4】:

    在我看来,由于双引号的存在,解释器会自动转义单引号 ' 所以它看到字符串以 " 开头并接受文本中的任何内容。

    它期望 \ 是一个转义字符,所以 \' 将只产生 ' 它还期望 " 终止字符串,因此将允许 ' 在字符串主体中相同。因此在内存中,两个字符串都将是

    Test "
    

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

    【讨论】:

      【解决方案5】:

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

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

      如果你写:

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

      正如我所说,意外的扩展只是被忽略了。

      【讨论】:

      • 我知道。它在我的问题中描述。问题是“为什么?”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      相关资源
      最近更新 更多