为什么JavaScript中`<newline>` === `\n`为真但`\r\n` === `\n`为假?
JavaScript模板字面量两种换行行为的核心差异
两者的处理阶段完全不同
- 第一种:模板字面量中的物理源代码换行,属于JS引擎解析源代码阶段的处理对象。
这套标准化规则的设计目的是抹平不同操作系统的换行符差异:Windows系统默认用CRLF(\r\n)作为文件换行符,Unix/Linux/macOS默认用LF(\n),旧版macOS曾用CR(\r)。如果没有标准化,同一份JS代码在不同平台保存、运行时,同一个模板字面量会产生完全不同的字符串结果,破坏跨平台一致性。ECMAScript规范明确要求,该阶段所有属于源代码结构的行终止符序列,都会统一被转换为\n。
因此对应的第一个比较成立:`foo boo` === `foo\nboo` // true - 第二种:模板字面量中显式书写的转义换行符(
\n/\r/\r\n),属于字符串的语义内容,JS引擎会原样保留不会做任何转换。
这些转义字符是开发者主动声明要在字符串中包含的控制字符,不属于源代码层面的换行结构,如果引擎擅自修改反而会破坏代码预期:比如你需要开发一个生成Windows格式文本的工具,主动写的\r\n如果被强制转成\n,生成的文件就会不符合格式要求。
因此另外两个比较结果都是false:\n、\r\n、\r本身就是完全不同的字符/字符序列,原样保留的情况下自然不可能相等:`foo\nboo` === `foo\r\nboo` // false `foo\nboo` === `foo\rboo` // false
内容的提问来源于stack exchange,提问作者Ilya Loskutov
相关产品推荐
相关产品推荐

