为什么'\u{1D11E}'.charAt(0) 不等于'\u{1D11E}'?
Why is '\u{1D11E}'.charAt(0) not equal to '\u{1D11E}'?
当我试图在控制台中计算这个表达式时,结果是 false
,为什么?
console.log('\u{1D11E}'.charAt(0) === '\u{1D11E}')
一个简单的 console.log 就能告诉你问题所在
console.log('\u{1D11E}'.charAt(0))
console.log('\u{1D11E}')
console.log('\u{1D11E}'.charAt(0) === '\u{1D11E}')
如您所见,它们不会给出相同的结果,这是因为 charAt
仅处理 UTF-16
code units。请参阅同一来源的代码片段,了解如何处理 UTF-16 字符(也在其他平面上,因此代码点 > 65535)。
'\u{1D11E}'
是由单个 Unicode codepoint U+1D11E
组成的字符串。字符串以 UTF-16 格式编码。所以字符串中的每个char
都是一个UTF-16编码单元。因此 charAt()
returns 一个代码单元,而不是代码点。
U+1D11E
在 UTF-16 中编码为 0xD834 0xDD1E
,因此字符串 '\u{1D11E}'
实际上是 '\uD834\uDD1E'
,因此:
'\u{1D11E}'.charAt(0) === '\u{1D11E}' // false
// aka: '\uD834' === '\u{1D11E}'
和
'\u{1D11E}'.charAt(0) === '\uD834' // true
// aka: '\uD834' === '\uD834'
当我试图在控制台中计算这个表达式时,结果是 false
,为什么?
console.log('\u{1D11E}'.charAt(0) === '\u{1D11E}')
一个简单的 console.log 就能告诉你问题所在
console.log('\u{1D11E}'.charAt(0))
console.log('\u{1D11E}')
console.log('\u{1D11E}'.charAt(0) === '\u{1D11E}')
如您所见,它们不会给出相同的结果,这是因为 charAt
仅处理 UTF-16
code units。请参阅同一来源的代码片段,了解如何处理 UTF-16 字符(也在其他平面上,因此代码点 > 65535)。
'\u{1D11E}'
是由单个 Unicode codepoint U+1D11E
组成的字符串。字符串以 UTF-16 格式编码。所以字符串中的每个char
都是一个UTF-16编码单元。因此 charAt()
returns 一个代码单元,而不是代码点。
U+1D11E
在 UTF-16 中编码为 0xD834 0xDD1E
,因此字符串 '\u{1D11E}'
实际上是 '\uD834\uDD1E'
,因此:
'\u{1D11E}'.charAt(0) === '\u{1D11E}' // false
// aka: '\uD834' === '\u{1D11E}'
和
'\u{1D11E}'.charAt(0) === '\uD834' // true
// aka: '\uD834' === '\uD834'