Skip to content
Advertisement

Why is “ === `n` true but `rn` === `n` is false? [closed]

There are different control character/sequence of them which represent(s) a new line with regard to different platforms. In accordance with the rules of template literals interpretation, under whatever platform JavaScript code is running, a new line within the literal must be normalized to line feed (n). In terms of the spec, <CR><LF> and <CR> LineTerminatorSequences are normalized to <LF> for both TV and TRV.

So it returns true:

`foo
boo` === `foonboo`

However, this logic is not applicable when we explicitly put the different representations of new line:

`foonboo` === `foornboo` // false
`foonboo` === `foorboo` // false

Why does JavaScript distinguish these two cases? What is the difference between them?

Advertisement

Answer

The full text of the note in the ECMAScript specification is as follows:

TV excludes the code units of LineContinuation while TRV includes them. <CR><LF> and <CR> LineTerminatorSequences are normalized to <LF> for both TV and TRV. An explicit EscapeSequence is needed to include a <CR> or <CR><LF> sequence.

Emphasis added.

This means that `rn` and `r` are preserved. Therefore, the code works as expected:

console.log([...`rn`]);
console.log([...`r`]);
console.log([...`
`]);
.as-console-wrapper { max-height: 100% !important; }
User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement