字符串的扩展
1. 字符的 Unicode 表示法
- 有了这种表示法之后,JavaScript 共有 6 种方法可以表示一个字符。
'\z' === 'z' // true
'\172' === 'z' // true
'\x7A' === 'z' // true
'\u007A' === 'z' // true
'\u{7A}' === 'z' // true
2. string.formCodePointAt()
ES6 提供了String.fromCodePoint方法,可以识别大于0xFFFF的字符,弥补了String.fromCharCode方法的不足。在作用上,正好与codePointAt方法相反。
3. 字符串的遍历器接口
1. ES6 为字符串提供了遍历器接口,使得字符串可以被 `for...of`循环遍历
2. 除了遍历字符串外,相比较于传统的 for 循环,还可以识别大于`0xFFFF`的码点
4. normalize()
1. ES6 提供字符串实例的normalize()方法,用来将字符的不同表示方法统一为同样的形式,这称为 Unicode 正规化。
5. includes(), startsWith(), endsWith()
1. 三者均是用来判断一个字符串是否包含在另一个字符串中的。(`indexOf`)
2. 均会返回 `boolean` 值,后两者表示是否在开头和结尾
3. 可传入两个参数,第二个参数为开始搜索的索引位置 (如果是 endWidth() 则表示前 n 个字符)。
6. repeat() String.repeat(Number)
1. 将原字符串重复多少次,返回一个新的字符串。
2. 小数会被取整,负数或者无穷会报错。
3. NaN 会被认为是 0
7. padStart() padEnd() ES7 String.padStart(Number, String2)
1. 使用 String2 字符串将 String 补全值 Number 位,padStart 用于头部补全。
2. 如果 `String2.length > String.length` 返回 String,操作不生效。
3. 如果 `String2.length + String.length > Number` 截取 String2 前几位。
4. 第二个参数不传时,默认用空格补全。
5. 另一个用途是提示字符串格式。
12'.padStart(10, 'YYYY-MM-DD') // "YYYY-MM-12"
'09-12'.padStart(10, 'YYYY-MM-DD') // "YYYY-09-12"
8. matchAll()
matchAll方法返回一个正则表达式在当前字符串的所有匹配
9. 模板字符串
`string ${} string`
- {} 中可以存放函数执行。
- 会保留所用空格
10. 模板编译 (有点儿复杂)
1. 通过模板字符串生成正式模板
2. 模板字符串也可以紧随函数后,视为将字符串传入函数并执行。
```
alert`123` == alert(123);
```
3. “标签模板”的一个重要应用,就是过滤 HTML 字符串,防止用户输入恶意内容。
4. 标签模板的另一个应用,就是多语言转换(国际化处理)。
11. String.raw()
1. 模板字符串的反解意。
```
String.raw`Hi\\n`
// 返回 "Hi\\\\n"
```
正则的扩展
1. RegExp 构造函数
- 修复了 ES5 的小问题
new RegExp(/abc/ig, 'i').flags // "i" // 上面代码中,原有正则对象的修饰符是ig,它会被第二个参数i覆盖。
2. 字符串的正则方法
字符串共有四个方法: match() 、 replace() 、 search() 、 split()
ES6 将其全部定义在 `RegExp` 对象上
3. u 修饰符
- ES6 对正则表达式添加了u修饰符,含义为“Unicode 模式”,用来正确处理大于\uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。
- 正则实例对象新增unicode属性,表示是否设置了u修饰符。
4. y 修饰符 (粘连修饰符) sticky
- 约等于
/g
修饰符,区别在于/g
为只要后面有就会接着进行,而/y
必须从剩余的第一项开始匹配,剩余的第一项不符合,则为 null。 - 单单一个y修饰符对match方法,只能返回第一个匹配,必须与g修饰符联用,才能返回所有匹配。
'a1a2a3'.match(/a\d/y) // ["a1"]
'a1a2a3'.match(/a\d/gy) // ["a1", "a2", "a3"]
- y修饰符的一个应用,是从字符串提取 token(词元),y修饰符确保了匹配之间不会有漏掉的字符。
- 与y修饰符相匹配,ES6 的正则实例对象多了sticky属性,表示是否设置了y修饰符。
var r = /hello\d/y;
r.sticky // true
ES6 为正则表达式新增了 RegExp.prototype.flags属性,返回正则表达式的修饰符
5. s 修饰符 (ES2018加入)
s修饰符,使得.可以匹配任意单个字符。
/foo.bar/s.test('foo\nbar') // true
这被称为dotAll模式,即点(dot)代表一切字符。所以,正则表达式还引入了一个dotAll属性,返回一个布尔值,表示该正则表达式是否处在dotAll模式。
/s修饰符和多行修饰符/m不冲突,两者一起使用的情况下,.匹配所有字符,而^和$匹配每一行的行首和行尾。