您混淆了 unicode 规范化和字符串转义。
"café"
…是由code points 0x63, 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。