Unicode表示法
- 允许采用
\uxxxx
形式表示一个字符,其中xxxx
字符表示Unicode码点。但是这种表示法只限于码点在\u0000
~\uFFFF
之间的字符。超出这个范围的字符,必须写在{}
中。
console.log("\u0061");
console.log('\uD842\uDFB7');
console.log("\u{20BB7}");
'\u{20BB7}' === '\uD842\uDFB7'
遍历器接口
- ES6为字符串添加了遍历器(Iterator)接口,使得字符可以被
for..of
循环遍历。
for (let codePoint of 'foo') {
console.log(codePoint)
}
- 遍历器最大的优点是可以识别大于
0xFFFF
的码点,传统的for
循环无法识别。
let text = String.fromCodePoint(0x20BB7);
for (let i = 0; i < text.length; i++) {
console.log(text[i]);
}
for (let i of text) {
console.log(i);
}
模板字符串
- 大括号内部可以放入任意的 JavaScript 表达式,可以进行运算,以及引用对象属性。
`In JavaScript '\n' is a line-feed.`
let name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`
let ul = `
<ul>
<li>first</li>
<li>second</li>
</ul>
`
新增方法
静态方法
fromCodePoint()
- ES5 提供
String.fromCharCode()
方法,用于从 Unicode 码点返回对应字符,但是这个方法不能识别码点大于0xFFFF
的字符。ES6 提供了String.fromCodePoint()
方法,可以识别大于0xFFFF
的字符。
String.fromCodePoint(0x20BB7)
String.fromCodePoint(0x78, 0x1f680, 0x79)
raw()
- 该方法返回一个斜杠都被转义的字符串,往往用于模板字符串的处理方法。
String.raw`Hi\n${2+3}!`
实例方法
codePointAt()
- 会正确返回四个字节的UTF-16字符的码点。对于那些两个字节储存的常规字符,它的返回结果与
charCodeAt()
方法相同。
let s = "𠮷";
s.length
s.charAt(0)
s.charAt(1)
s.charCodeAt(0)
s.charCodeAt(1)
s.codePointAt(0)
s.codePointAt(1)
let s = '𠮷a';
s.codePointAt(0).toString(16)
s.codePointAt(2).toString(16)
for (let ch of s) {
console.log(ch.codePointAt(0).toString(16));
}
normalize()
includes()
- 返回布尔值,表示是否找到了参数字符串。第二个参数,表示开始搜索的位置。
let s = 'Hello world!';
s.includes('o')
s.includes('Hello', 6)
startsWith()
- 返回布尔值,表示参数字符串是否在原字符串的头部。第二个参数,表示开始搜索的位置。
let s = 'Hello world!';
s.startsWith('H')
s.startsWith('world', 6)
endsWith()
- 返回布尔值,表示参数字符串是否在原字符串的尾部。第二个参数,表示结束搜索的位置,针对的是前
n
个字符(指的是前n个字符,是否以指定参数结尾)。
let s = 'Hello world!';
s.endsWith('world!')
s.endsWith('llo', 5)
repeat()
'hello'.repeat(2)
'na'.repeat(0)
'na'.repeat('na')
'na'.repeat('3')
padStart()
- 如果某个字符串不够指定长度,会在头部补全。接受两个参数,参数一是字符串补全生效的最大长度;参数二是用来补全的字符串。
'x'.padStart(5, 'ab')
'x'.padStart(4, 'ab')
'1'.padStart(10, '0')
padEnd()
- 如果某个字符串不够指定长度,会在尾部补全。接受两个参数,参数一是字符串补全生效的最大长度;参数二是用来补全的字符串。
'x'.padEnd(5, 'ab')
'x'.padEnd(4, 'ab')
trimStart()
const s = ' abc ';
s.trim()
s.trimStart()
trimEnd()
const s = ' abc ';
s.trim()
s.trimStart()
matchAll()
replaceAll()
- 字符串的实例方法
replace()
只能替换第一个匹配,replaceAll()
方法,可以一次性替换所有匹配。
'aabbcc'.replaceAll('b', '_')
- 如果参数一是一个不带有
g
修饰符的正则表达式,replaceAll()
会报错。这一点跟replace()
不同。
'aabbcc'.replace(/b/, '_')
'aabbcc'.replaceAll(/b/, '_')
- 参数二是一个字符串,表示替换的文本,其中可以使用一些特殊字符串。
'abbc'.replaceAll('b', '$&')
'abbc'.replaceAll('b', '$`')
'abbc'.replaceAll('b', `$'`)
'abbc'.replaceAll(/(ab)(bc)/g, '$2$1')
'abc'.replaceAll('b', '$$')
- 参数二也可以是一个函数,该函数的返回值会替换掉第一个参数匹配的文本。
'aabbcc'.replaceAll('b', () => '_')
at()
- 接受一个整数作为参数,返回参数指定位置的字符,支持负索引。
const str = 'hello';
str.at(1)
str.at(-1)