Unicode

Unicode Identifiers

Unicode 标识符,下面几种方式等效:

var a = "abc"
console.log(a)

// Unicode escape sequences
var \u0061 = "abc"
console.log(\u0061)

// Unicode code point escape sequences
var \u{61} = "abc"
console.log(\u{61})

下面以 🐎 horse emoji \u{1f40e} 为例说明。

String

JavaScript 内部使用 utf-16 编码,在处理 non-BMP symbols 时会有问题

var a = 'a'
a.length // 1

var horse = '🐎'
horse.length // 2

不只是 length, indexOf(), charAt(), charCodeAt() 等传统方法都受到影响。只有新方法 codePointAt(), for...of 等支持 unicode。

const str = 'a🐎'
for (const char of str) {
  console.log(char)
}

RegExp

unicode flag u

一,不必要的转义将抛出异常

/\a/.test('ab') // true
/\a/u.test('ab') // SyntaxError: Invalid regular expression: /\a/: Invalid escape

二,regexp 可以使用 \u{}。如果不使用 unicode flag,\u{} 将视为 \u + {},而 \u 是非必要转义,结果为 u

/\u{1f40e}/.test('🐎') // false
/\u{1f40e}/.test('u{1f40e}') // true
/\u{1f40e}/u.test('🐎') // true

三,. 的范围扩大

/^.$/.test('🐎') // false
/^.$/u.test('🐎') // true