1

1 字符串的Unicode表示法

ES6 只要将码点放入大括号,就能正确解读该字符;

var x = "\u20bb7";
document.write(x); //₻7
var x = "\u{20bb7}";
document.write(x); //? 可正确返回

2 codePointAt()

JavaScript对于那些需要4个字节储存的字符(Unicode码点大于0xFFFF的字符),JavaScript会认为它们是两个字符。

var s = "?";

s.length // 2
s.charAt(0) // ''
s.charAt(1) // ''
s.charCodeAt(0) // 55362
s.charCodeAt(1) // 57271

ES6提供了codePointAt方法,能够正确处理4个字节储存的字符,返回一个字符的码点。

var x = "\u{20bb7}";
console.log(x); //吉
console.log(x.length);
console.log(x.codePointAt(0)); //134071
console.log(x.codePointAt(0).toString(16)); //20bb7
console.log(x.codePointAt(1)); //57271

codePointAt(0)返回的是十进制码点;codePointAt(1)则返回的结果与charCodeAt方法返回的结果相同

3 String.fromCodePoint()

ES5提供String.fromCharCode方法,用于从码点返回对应字符,但是这个方法不能识别32位的UTF-16字符(Unicode编号大于0xFFFF)。

ES6提供了String.fromCodePoint方法,可以识别0xFFFF的字符,弥补了String.fromCharCode方法的不足。在作用上,正好与codePointAt方法相反。

console.log(String.fromCharCode("0x20bb7")); //ஷ
console.log(String.fromCodePoint("0x20bb7")); //吉

4 字符串的遍历器接口

ES6为字符串添加了遍历器接口,使得字符串可以被for...of循环遍历。

这个遍历器最大的优点是可以识别大于0xFFFF的码点

var text = String.fromCodePoint("0x20bb7"); //吉
for (let i = 0; i < text.length; i++) {
    console.log(text[i]);
    //�
    //�
}
for (let codePoint of text) {
    console.log(codePoint); //?
}

5 at()

ES7为字符串实例提供了at方法,可以识别Unicode编号大于0xFFFF的字符。

6 normalize()

ES6提供字符串实例的normalize()方法,用来将字符的不同表示方法统一为同样的形式,这称为Unicode正规化。

'\u01D1'.normalize() === '\u004F\u030C'.normalize()
// true

不过,normalize方法目前不能识别三个或三个以上字符的合成。

7 includes(),startsWith(),endsWith()

传统上,JavaScript只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6又提供了三种新方法。

  • includes():返回布尔值,表示是否找到了参数字符串。

  • startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。

  • endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。


var str = "string";
console.log(str.includes("r")); //True
console.log(str.startsWith("str")); //True
console.log(str.endsWith("g")); //True

另外,他们都支持第二个参数用来表示开始搜索的位置,但endsWith针对的则是前n个字符

8 repeat()

repeat方法返回一个新字符串,表示将原字符串重复n次。

var str = "string";
console.log(str.repeat(2)); //stringstring

9 padStart(),padEnd()

padStart用于头部补全,padEnd用于尾部补全。

两个参数:1个是最小字符串长度;另一个是补全的字符串

10 模板字符串

模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。

var name = "Oliver"; //变量
var info = `hello world
 welcome you`; //多行字符串
console.log(`hello ${name}`,info); //嵌套变量,输出多行字符串

变量应该写在${}大括号里面,并且可以放入任意的JS表达式;

11 标签模板

下面的例子实际上是函数参数如下的调用:

tag(["Hello ", "; Infomation: ", ""],Oliver,welcome to use the system.);

tag函数写法如下:

let user = {
    name: "Oliver",
    info: "welcome to use the system."
};
tag`Hello ${user.name}; Infomation: ${user.info}`;
function tag(s, v1, v2) {
    console.log(s); //["Hello ", "; Infomation: ", ""]
    console.log(v1); //Oliver
    console.log(v2); //welcome to use the system.
}

12 String.raw()

String.raw方法,往往用来充当模板字符串的处理函数,返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,对应于替换变量后的模板字符串。

String.raw`Hi\n${2+3}!`;
// "Hi\\n5!"

String.raw`Hi\u000A!`;
// 'Hi\\u000A!'

String.raw方法也可以作为正常的函数使用。这时,它的第一个参数,应该是一个具有raw属性的对象,且raw属性的值应该是一个数组。

String.raw({ raw: 'test' }, 0, 1, 2);
// 't0e1s2t'

// 等同于
String.raw({ raw: ['t','e','s','t'] }, 0, 1, 2);

JS菌
6.4k 声望2k 粉丝