diff --git a/docs/string.md b/docs/string.md index 1b59e2e..2171593 100644 --- a/docs/string.md +++ b/docs/string.md @@ -41,21 +41,6 @@ codePointAt方法是测试一个字符由两个字节还是由四个字节组成 ```javascript -function is32Bit(c) { - return c.codePointAt(0) > 0xFFFF; -} - -is32Bit("𠮷") // true -is32Bit("a") // false - -``` - -## String.fromCodePoint方法 - -该方法用于从Unicode编号返回对应的字符串,作用与codePointAt正好相反。 - -```javascript - String.fromCodePoint(134071) // "𠮷" ``` @@ -100,9 +85,13 @@ ES6对这一点做出了改进,只要将超过0xFFFF的编号放入大括号 ES6对正则表达式添加了u修饰符,用来正确处理大于\uFFFF的Unicode字符。 +**(1)点字符** + +点(.)字符在正则表达式中,解释为除了换行以外的任意单个字符。对于大于\uFFFF的Unicode字符,点字符不能识别,必须加上u修饰符。 + ```javascript -var s = "𠮷"; +大于\uFFFF的Unicode字符var s = "𠮷"; /^.$/.test(s) // false /^.$/u.test(s) // true @@ -111,6 +100,46 @@ var s = "𠮷"; 上面代码表示,如果不添加u修饰符,正则表达式就会认为字符串为两个字符,从而匹配失败。 +**(2)Unicode字符表示法** + +ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达式中必须加上u修饰符,才能识别。 + +```javascript + +/\u{61}/.test('a') // false +/\u{61}/u.test('a') // true +/\u{20BB7}/u.test('𠮷') // true + +``` + +上面代码表示,如果不加u修饰符,正则表达式无法识别\u{61}这种表示法,只会认为这匹配属61个连续的u。 + +**(3)量词** + +使用u修饰符后,所有量词都会正确识别大于\uFFFF的Unicode字符。 + +```javascript + +/a{2}/.test('aa') // true +/a{2}/u.test('aa') // true +/𠮷{2}/.test('𠮷𠮷') // false +/𠮷{2}/u.test('𠮷𠮷') // true + +``` + +**(4)预定义模式** + +u修饰符也影响到预定义模式,正确识别大于\uFFFF的Unicode字符。 + +```javascript + +/^\S$/.test('𠮷') // false +/^\S$/u.test('𠮷') + +``` + +上面代码的`\S`是预定义模式,匹配所有不是空格的字符。只有加了u修饰符,它才能正确匹配大于\uFFFF的Unicode字符。 + 利用这一点,可以写出一个正确返回字符串长度的函数。 ```javascript @@ -127,6 +156,19 @@ codePointLength(s) // 2 ``` +**(5)i修饰符** + +有些Unicode字符的编码不同,但是字型很相近,比如,\u004B与\u212A都是大写的K。 + +```javascript + +/[a-z]/i.test('\u212A') // false +/[a-z]/iu.test('\u212A') // true + +``` + +上面代码中,不加u修饰符,就无法识别非正规的K字符。 + ## contains(), startsWith(), endsWith() 传统上,JavaScript只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6又提供了三种新方法。 @@ -251,7 +293,7 @@ console.log(`${ x } + ${ y } = ${ x + y}`) 上面代码表示,在模板字符串中嵌入变量,需要将变量名写在${}之中。 模板字符串使得字符串与变量的结合,变得容易。下面是一个例子。 - +This article explains the effects of the u flag. It helps if you’ve read JavaScript has a Unicode problem first. ```javascript if (x > MAX) {