您混淆了 unicode 规范化和字符串转义。
"café"
…是由字符组成的字符串代码点 https://en.wikipedia.org/wiki/Code_point0x63、0x61、0x66、0xe9。
您可以使用转义表示获得完全相同的字符串
"caf\u00e9"
// or even
"\u0063\u0061\u0066\u00e9"
// or why not
"\u0063\u0061fé"
当读取这样的字符串时,JavaScript 会取消转义该字符串。也就是说,它用匹配的字符替换转义序列。这与用新行替换“\n”的过程完全相同。
现在,您的第二个示例实际上是另一个字符串,因为它没有标准化。它是由字符 0x63、0x61、0x66、0x65、0x301 组成的字符串。由于没有发生标准化,因此它不是同一个字符串。
现在尝试使用相同的字符串,使用该序列,您无法使用键盘输入该序列,但我为您复制粘贴到此处:"café"
。现在测试一下:
> a = "café" // this one is copy-pasted with the combining acute
> b = "café" // this one is typed using the "é" key on my keyboard
> a === "cafe\u0301"
<- true
> b === "cafe\u0301"
<- false
> a === "caf\u00e9"
<- false
> b === "caf\u00e9"
<- true
> a === b
<- false
// Now just making sure...
> a.length
<- 5
> b.length
<- 4
“café”和“café”呈现相同的事实并不意味着它们是相同的字符串。 JavaScript 比较字符串,发现0x63, 0x61, 0x66, 0xe9
不等于0x63, 0x61, 0x66, 0x65, 0x301
并返回 false。