【问题标题】:Why is `<newline>` === `\n` true but `\r\n` === `\n` is false? [closed]为什么 `<newline>` === `\n` 为真而 `\r\n` === `\n` 为假? [关闭]
【发布时间】:2022-01-01 22:54:31
【问题描述】:

它们有不同的控制字符/序列,代表不同平台的新行。根据模板文字解释的规则,在任何平台 JavaScript 代码运行下,文字中的新行必须规范化为换行符 (\n)。至于spec&lt;CR&gt;&lt;LF&gt; and &lt;CR&gt; LineTerminatorSequences are normalized to &lt;LF&gt; for both TV and TRV.

所以它返回true:

`foo
boo` === `foo\nboo`

但是,当我们显式放置换行符的不同表示时,这个逻辑就不适用了:

`foo\nboo` === `foo\r\nboo` // false
`foo\nboo` === `foo\rboo` // false

为什么 JavaScript 区分这两种情况?它们有什么区别?

【问题讨论】:

  • 因为不同的字符不一样?如果我们做"ab" === "acb",你肯定会看到同样的事情。
  • 因为\n和\r不一样????
  • 等一下,如果你引用标准,为什么你在引用之后省略了下一句:“一个明确的 EscapeSequence 需要包含一个 序列。"?

标签: javascript template-literals


【解决方案1】:

the ECMAScript specification中的笔记全文如下:

TV 不包括 LineContinuation 的代码单元,而 TRV 包括它们。对于 TV 和 TRV,&lt;CR&gt;&lt;LF&gt;&lt;CR&gt; LineTerminatorSequences 被标准化为 &lt;LF&gt;需要显式的 EscapeSequence 才能包含 &lt;CR&gt;&lt;CR&gt;&lt;LF&gt; 序列。

添加了重点。

这意味着`\r\n``\r` 被保留。因此,代码按预期工作:

console.log([...`\r\n`]);
console.log([...`\r`]);
console.log([...`
`]);
.as-console-wrapper { max-height: 100% !important; }

【讨论】:

    【解决方案2】:

    注意

    '\u000A\u000D' === '\n\r'`
    

    因为\n\r 只是给定控制字符的别名。

    您还可以看到 LF 的标准化发生在

    eval("`\n\r`") === "\n\n"
    

    每个字符都变成 LF,并且

    eval("`\r\n`") === "\n"
    

    CR+LF 变为 LF。 但同样,这仅适用于源 parsing 阶段(因此是 eval),在文字中显式使用它或在从外部资源读取字符串时工作没有“隐藏”规范化,因此比较将作为预计。

    【讨论】:

      猜你喜欢
      • 2012-07-03
      • 2013-09-09
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      相关资源
      最近更新 更多