es6在字符串上添加了不少方法,这里就提出几个进行说明。
编码方法
在计算机中,所有的字符都是用二进制表示的,UTF-16的编码允许我们使用2的16次方个二进制表示字符,但其实这个范围已经不满足越来越多的字符了,所以允许使用两个16位二进制表示一个字符。
在es5中,所有字符串操作都是基于16位二进制的,所以当一个字符是由两个16位二进制表示的时候,会出现一些问题。
var text = '𠮷'
// 这个字符的 text.length 就是2,由于是由两个16位二进制表示的
text.charAt(0) // 不会返回'𠮷',而是'\uD842',返回的是前16位表示的字符
es6提供 charPointAt() 和 fromCodePoint() 方法处理这种情况。
es6提供 normalize() 方法将当前字符串规范化,在字符串进行排序和比较时,可以使用normalize将它们标准化为同一种形式。
平时很少会用到这些关于编码的方法,但开发国际化应用的时候,尤其是日语,会包含很多这样的编码。
模板字面量
用反引号(`)包裹字符串。
换行
// 使用引号或双引号尝试写多行字符串时,会报错
let s1 = '1233
dfgd';
//可用反斜杠换行写(这是js中的一个语法bug),但没有实现输出换行
let s2 = '1435\
sdfs'; //1435sdfs
//实现输出换行可用\n换行符
let s3 = '3534\n\
sdfd';
/**
3534
sdfd
*/
// 但是es6提供的反引号可以直接换行写,并实现输出换行
let s4 = `w345
2354`;
/**
w345
2354
*/
//反撇号中所有的空白符都属于字符串的一部分
let s5 = `w345
2354`;
/**
w345
2354
*/
占位符
使用${}的形式将合法的js表达式添加到字符串中,这个js表达式可以是变量也可以是运算符或函数调用。
标签模板
let m = tag`Hello world`
在模板字面量第一个反撇号前标注的字符串,标签tag就是一个函数,一个用于处理其后模板字面量的函数。
// literals是一个数组,每一项是被 ${} 分割的字符串,包括空字符串
// substitutions暂时将其看成一个数组,每一项是 ${} 中间的解释值
function tag(literals, ...substitutions) {
//返回一个字符串
}