1. 字符的Unicode表示法
如果直接在“\u”后面跟上超过0xFFFF的数值(比如\u20BB7),JavaScript会理解成“\u20BB+7”。由于\u20BB是一个不可打印字符,所以只会显示一个空格,后面跟着一个7。
ES6对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。
"\u{20BB7}" // "𠮷""
\u{41}\u{42}\u{43}" // "ABC"
let hello = 123;
hell\u{6F} // 123
'\u{1F680}' === '\uD83D\uDE80' // true
有了这种表示法之后,JavaScript共有6种方法可以表示一个字符。
'\z' === 'z' // true
'\172' === 'z' // true
'\x7A' === 'z' // true
'\u007A' === 'z' // true
'\u{7A}' === 'z' // true
2. codePointAt()
ES6提供了codePointAt方法,能够正确处理4个字节储存的字符,返回一个字符的码点。
var s = '𠮷a';
s.codePointAt(0) // 134071
s.codePointAt(1) // 57271
s.charCodeAt(2) // 97
3. String.fromCodePoint()
ES6提供了String.fromCodePoint方法,可以识别大于0xFFFF的字符,弥补了String.fromCharCode方法的不足。在作用上,正好与codePointAt方法相反。
4. 字符串的遍历器接口
for (let codePoint of 'foo') {
console.log(codePoint);
} //"f","o","o"
- 优点:可以识别大于0xFFFF的码点。
5. at()
- 优点:可以识别Unicode编号大于0xFFFF的字符,返回正确的字符。
'abc'.at(0) // "a"
'𠮷'.at(0) // "𠮷"
6. normalize()
7. includes(),startsWith(),endsWith()
- includes():返回布尔值,表示是否找到了参数字符串。
- startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
- endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。
这三个方法都支持第二个参数,表示开始搜索的位置。
使用第二个参数n时,endsWith的行为与其他两个方法有所不同。它针对前n个字符,而其他两个方法针对从第n个位置直到字符串结束。
8. repeat()
- repeat方法返回一个新字符串,表示将原字符串重复n次
- 如果是小数,会被取整。
- 如果参数是负数或者infinity,报错。
- 如果是0到-1之间的小数,等同于0.
- 参数NaN等同于0.
- 如果参数是字符串,则会先转换成数字。
9. padStart(),padEnd()
ES6推出了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart
用于头部补全,padEnd用于尾部补全。
'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'
'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'
- 如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。
- 如果用来补全的字符串与原字符串,两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串。
- 如果省略第二个参数,则会用空格补全长度。
- padStart的常见用途是为数值补全指定位数。
'1'.padStart(10, '0') // "0000000001"
'12'.padStart(10, '0') // "0000000012"
'123456'.padStart(10, '0') // "0000123456"
- 另一个用途是提示字符串格式。
'12'.padStart(10, 'YYYY-MM-DD') // "YYYY-MM-12"
'09-12'.padStart(10, 'YYYY-MM-DD') // "YYYY-09-12"
10. 模板字符串
传统的JavaScript语言,输出模板如下:
$('#result').append(
'There are <b>' + basket.count + '</b> ' +
'items in your basket, ' +
'<em>' + basket.onSale +
'</em> are on sale!'
);
ES6引入了模板字符串,如下:
$('#result').append(
` There are <b>${basket.count}</b> items
in your basket, <em>${basket.onSale}</em>
are on sale!`
);
- 模板字符串中嵌入变量,需要将变量名写在${}中。
function authorize(user, action) {
if (!user.hasPrivilege(action)) {
throw new Error(
// 传统写法为
// 'User '
// + user.name
// + ' is not authorized to do '
// + action
// + '.'
`User ${user.name} is not authorized to do ${action}.`);
}
}
- 大括号内部可以放入任意的JavaScript表达式,可以进行运算,以及引用对象属性。
var x =1;
var y = 2;
'${x} + ${y} = ${x+y};
// 1 + 2 = 3
- 模板字符串之中还能调用函数
如果大括号中的值不是字符串,将按照一般的规则转为字符串。如:大括号中是一个对象,将默认调用对象的toString方法。
- 如果模板字符串中的变量没有声明,报错。
- 如果大括号中是一个字符串,将原样输出。
- 模板字符串可以嵌套。
11. 标签模板
模板字符串可以紧跟在一个函数后面,该函数被调用来处理这个模板字符串。
alert '123';
//等同于
alert(123);
12. String.raw()
-
该方法往往用来充当模板字符串的处理函数,返回一个斜杠都被转义(即斜杠钱再加一个斜杠)的字符串,对应于替换变量后的模板字符串。
String.rawHi\n${2+3}!
;
// "Hi\n5!"String.raw`Hi\u000A!`; // 'Hi\\u000A!'
-
如果原字符串的斜杠已经转义,那么String.raw不会做任何处理。
-
String.raw方法也可以作为正常的函数使用。这时,它的第一个参数,应该是一个具有raw属性的对象,且raw属性的值应该是一个数组。
String.raw({ raw: 'test' }, 0, 1, 2);// 't0e1s2t'
// 等同于
String.raw({ raw: ['t','e','s','t'] }, 0, 1, 2);
网友评论