1. 字符的Unicode表示法
ES6加强了对Unicode的支持,允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的Unicode码点。但是这种表示法只限于码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,必须用两个双字节的形式表示。
2.字符串的遍历器接口
ES6为字符串添加了遍历器接口,使得字符串可以被for…if循环遍历。
for (let codePoint of 'foo'){
console.log(codePoint)
}
//"f"
//"o"
//"o"
除了遍历字符串,这个遍历器最大的优点是可以识别大于0xFFFF的码点,传统的for循环无法之别这样的码点。
4. JSON.stringify()的改造
ES2019改变了JSON.stringify()的行为。如果遇到0xD800到0xDFFF之间的单个码点,或者不存在的配对形式,它会返回转义字符串,留给应用自己决定下一步的处理。
JSON.stringify('\u{D834}') //""\\uD834""
JSON.stringify('\uDF06\uD834') //""\\udf06\\ud834""
5.模板字符串
$('#reuslt').append(`
There are <b>${basket.count}</b> items
in your basket,<em>${basket.onSale}</em>
are on sale!
`);
模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。模板字符串中嵌入变量需要将变量名写在${}里。大括号内部可以放入任意的JS表达式,可以进行运算,以及引用对象属性,可以调用函数。
// 普通字符串
`In JavaScript '\n' is a line-feed.`
// 多行字符串
`In JavaScript this is
not legal.`
console.log(`string text line 1
string text line 2`);
// 字符串中嵌入变量
let name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`
如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。
let greeting = `\`Yo\` World!`;
如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。
模板字符串还可以嵌套。
6.标签模板
模板字符串可以紧跟在一个函数名后边,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template).
alert `123`
//=
alert(123)
标签模板的一个重要应用就是过滤HTML字符创,防止用户输入恶意内容。
let message =
SaferHTML1<p>${sender} has sent you a message.</p>`;
function SaferHTML(templateData){
les s = templateData[0];
for(let i = 1;i<arguments.length;i++){
let arg = String(arguments[i]);
//Escape special characters in the substitution.
s+=arg.replace(/&/g,"&")
.replace(/</g,"<")
.replace(/>/g,">");
s+= templateData[i];
}
return s;
}
7.字符串的新增方法
1. String.fromCodePoint()
ES5提供String.fromCharCode()方法,用于从Unicode码点返回对应字符,但是这个方法不能码点大于0xFFFF的字符。ES6提供了String.fromCodePoint()方法,可以识别0xFFFF的字符。
2.Strong.raw()
该方法返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,往往用于模板字符串的处理方法。
如果原字符串的斜杠已经转义,那么String.raw()会再次转义。
String.raw()方法也可以作为正常的函数使用。这时,它的第一个参数,应该是一个具有raw属性的对象,且raw属性的值应该是一个数组。
String.raw({raw"'test'},0,1,2);
//'t0e1s2t'
//=
String.raw({raw:['t','e','s','t']},0,1,2);
3.实例方法:codePointAt()
JavaScript内部,字符以UTF-16的格式储存,一般为2个字节。对4个字节的字符会认为是2个字符
codePointAt()能够正确处理4个字节储存的字符,返回一个字符的码点。
4.normalize()
ES6 提供字符串实例的normalize()
方法,用来将字符的不同表示方法统一为同样的形式,这称为 Unicode 正规化。
5.includes(),startsWith(),endsWith()
- includes(): 返回布尔值,表示是否找到了参数字符串。
- startsWith(): 返回布尔值,表示参数字符串是否在源字符串的头部。
- endsWith(): 返回布尔值,表示参数字符串是否在原字符串的尾部。
6.repeat()
repeat()方法返回一个新字符串,表示将原字符串重复n次。如果参数是小数,会取整。如果参数是负数或者Infinity会报错。如果参数是0-1之间的小数,由于先取整,视同为0。参数NaN等同于0。7.padStart(),padEnd()
padStart()用于头部补全,padEnd()用于尾部补全。
'x'.padStart(5,'ab') //'ababx'
'x'.padEnd(5,'ab') //'xabab'
8.trimStart(),strimEnd()
ES2019新增了这两个函数,trimStart()消除字符串头部的空格,trimEnd()消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串。