ES6-字符串的扩展

1、对Unicode 的支持:codePointAt()、fromCodePoint()

在ES5中,我们经常使用charAt() 来表示字符存储位置,用charCodeAt() 来表示对应位置字符Unicode 的编码。在JavaScript 内部,字符以UTF-16 的形式存储,每个字符固定为2个字节,对于那些需要4个字节存储的字符并不支持。因此,ES6使用 codePointAt() 方法来支持存储4字节的字符:

1
2
var s = '猿';
console.log(s.codePointAt(0)); // 29503

在 ES5 中,从码点返回对应的字符的方法是 fromCharCode(),这个并不能返回字符为32位的utf-16 的字符。ES6 中使用 String.fromCodePoint() 代替:

1
console.log(String.fromCodePoint(29503)); // 猿

2、字符串的遍历接口: for..of…

1
2
3
4
5
6
7
for(let str of 'yuan') {
console.log(str);
}
// y
// u
// a
// n

3、判断字符串是否包含在另一个字符串中

在ES5 中使用的是 indexOf() 方法,在ES6中可以使用includes()、startsWith()、endsWith()三个方法。 includes(): 返回布尔值,表示是否找到了参数字符串。 startsWith():返回布尔值,参数是否在源字符串的头部。 endsWith(): 返回布尔值,参数是否在源字符串的尾部。

1
2
3
4
var str = "yuan is an animal";
str.startsWith("is"); // false
str.endsWith(" animal"); // true
str.includes("an"); // true

接受第二个参数,可选的,表示开始搜索的位置。

1
2
3
4
var str = "yuan is an animal";
str.startsWith("a", 1); // false
str.endsWith("an", 3); // false
str.includes("w", 4); // false

使用第二个参数n时,endsWith() 指的是针对前n 个字符,二其它两个方法是指开始位置的字符到结束位置的字符。

4、字符串重复复制:repeat();

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

1
2
3
'o'.repeat(3); // 'ooo'
'ha'.repeat(2); // 'haha'
'yuan'.repeat(0); ''

注意:当repeat() 方法里的参数为小数时,会自动取整;为负数或者Infinity 时会报错;参数接近为0时,参数为0;参数为NaN、字符串时会先转化为Number 再进行转化。

5、字符串补全:padStart()、padEnd()

表达式:str.padEnd(targetLength [, padString]) 第一个参数targetLength 表示指定字符串的长度,第二个参数padString(可选)表示用来补全的字符串。 其它注意事项参照: padStart():用于头部补全。 padEnd():用于尾部补全。

1
2
's'.padStart(4, 'ab'); // 'abas'
's'.padEnd(7, 'dd2'); // '7dd2dd2'

6、模板字符串

语法:

1
2
3
4
5
6
7
8
`string text`

`string text line 1
string text line 2`

`string text ${expression} string text`

tag `string text ${expression} string text`

模板字符串使用反引号()来代替普通字符串的单引号和双引号。模板字符串可以包含特定语法(${expression})的占位符。占位符中的表达式和周围的文本会一起传递给一个默认的函数,该函数负责将所有的部分连接起来,如果模板字符串由表达式开头,则该字符串被称为带标签的模板字符串,该表达式通常是一个函数,它会在模板字符串处理后被调用,在输出最终结果前,你都可以通过该函数来对模板字符串进行操作处理,在模板字符中使用反引号(`)时,需要在它前面加上转义符()。 多行字符串

1
2
3
4
console.log(`string text line 1
string text line 2`)
// string text line 1
// string text line 2

表达式插补

1
2
3
var a = 2;
var b = 4;
console.log(`${a + b} is six`) // 6 is six

带标签的模板字符串

更高级的形式模板字面值被标记模板文本。标记使您可以分析模板文本功能。标记功能的第一个参数包含一个字符串值的数组。其余参数时相关的表达式。最后,你的函数可以返回处理好的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var person = 'Mike';
var age = 28;
function tagFunc(strings, personExp, ageExp) {

var str0 = strings[0]; // "that "
var str1 = strings[1]; // " is a "

// 在技术上,有一个字符串在
// 最终的表达式 (在我们的例子中)的后面,
// 但它是空的(""), 所以被忽略.
// var str2 = strings[2];

var ageStr;
if (ageExp > 60){
ageStr = 'old person';
} else {
ageStr = 'young person';
}
return str0 + personExp + str1 + ageStr;
}
var output = myTag`that ${ person } is a ${ age }`;
console.log(output); // that Mike is a young person

rest 参数的写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let name = '张三',
age = 20,
message = show`我来给大家介绍:${name}的年龄是${age}.`;

function show(stringArr,...values){
let output ="";
let index = 0
for(;index<values.length;index++){
output += stringArr [index]+values[index];
}
output += stringArr [index];
return output;
}
message; //"我来给大家介绍:张三的年龄是20."

标签函数并不一定需要返回一个字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function template(strings, ...keys) {
return (function(...values) {
var dict = values[values.length - 1] || {};
var result = [strings[0]];
keys.forEach(function(key, i) {
var value = Number.isInteger(key) ? values[key] : dict[key];
result.push(value, strings[i + 1]);
});
return result.join('');
});
}

var t1Closure = template`${0}${1}${0}!`;
t1Closure('Y', 'A'); // "YAY!"
var t2Closure = template`${0} ${'foo'}!`;
t2Closure('Hello', {foo: 'World'}); // "Hello World!"

原始字符串 在标签函数的第一个参数中,存在一个特殊的属性raw,我们可以通过它来访问模板字符串的原始字符串。

1
2
3
4
5
6
7
8
9
10
11
function tag(strings, ...values) {
console.log(strings.raw[0]);
}
tag`strings text line 1 n string text line 2`;
// strings text line 1 n string text line 2


此外,使用String.raw()方法创建原始字符串和使用默认的模板函数和字符串连接创建时一样的。

String.raw`hellon${44+44}!`
// "hellon88!"
  • 版权声明: 本博客所有文章,未经许可,任何单位及个人不得做营利性使用!转载请标明出处!如有侵权请联系作者。
  • Copyrights © 2015-2020 翟天野

请我喝杯咖啡吧~