为什么 String.indexOf 会这样运作?

Why is String.indexOf functioning like this?

我正在尝试根据用户输入的查询来匹配一些文本。在遇到一些问题后,我发现 String.indexOf 这种我根本无法理解的相当奇怪的行为:

如果我尝试将不带变音符号的查询与带变音符号的字符串进行匹配,它会起作用:(不知道为什么)

"brezzel cu brânză".indexOf("bra")

11

但是将同一个字符串与它后面的另一个字母匹配是行不通的:

"brezzel cu brânză".indexOf("bran")

-1

(在 Chrome 和 Firefox 中测试,行为相同)

这是我不知道的有记录的行为吗?或者这里到底发生了什么?

如果我没记错的话,js字符是按2字节编码的。但是许多其他 unicode 字符编码为 4 个字节。现在 char â 是 4 个字节。前 2 个字节是 a,这就是第一种情况起作用的原因。使用转义函数查看:

escape("brezzel cu brânză")
"brezzel%20cu%20bra%u0302nza%u0306"

看到 %20 是 space,然后是 bra,然后是 %u0302,它与前面的 a 一起编码

可能你会告诉剩下的。如果你想测试它:

'a' + String.fromCharCode('0x0302') //â