ES6给字符串带来了很多实用性的扩展:模板字符串,标签模板,repeat函数、includes函数,startsWith函数,endsWith函数,codePointAt函数,String.fromCodePoint函数,String.raw函数。
- S6对字符串新增了一些函数和操作规范,使得开发者对字符串的操作更加方便,以往需要借助其他javascript代码才能实现的效果,现在利用这些函数即可快速实现。
新特性1:模板字符串
模板字符串”是字符串的一个新特性,传统的字符串实现拼接的时候,要将变量插入字符串中,语法是这样的上面最后一句代码实现将变量name和occupation插入字符串中,这种写法没什么不好,只是数据一旦多起来就很繁琐,你会看到N多个加号“+”,N多个引号’ “” ‘,ES6给了我们另一种更简捷的写法,1
2
3
4
5let name = "Jacky";
let occupation = "doctor";
//传统字符串拼接
let str = "He is "+ name +",he is a "+ occupation;对比两段拼接的代码,模板字符串使得我们不再需要反复使用双引号(或者单引号)了;而是改用反引号标识符(`),插入变量的时候也不需要再使用加号(+)了,而是把变量放入${ }即可1
2
3
4let name = "Jacky";
let age = "18";
//模板字符串拼接
let str = `他名字是${name} 年龄是 ${age}`用时要注意的地方:
1、可以定义多行字符串
传统的多行字符串写法:模板字符串的写法1
2
3
4
5let str = "write once ," +
"run anywhere";
console.log(str)
//打印结果
write once ,run anywhere1
2
3
4
5
6let str = `write once ,
run anywhere`;
console.log(str)
//控制台打印结果
write once ,
run anywhere - 直接换行即可,但是要注意的是:所有的空格和所进都会被保留在输出中。如果控制台输出字符串str的话,代码上换了行,控制台输出的时候也会换行。
2、${ }中可以放任意的javascript表达式
${ }中可以是运算表达式${ }中可以是对象的属性1
2
3
4var a = 1;
var b = 2;
var str = `the result is ${a+b}`;
//进行加法运算 结果:the result is 3${ }中可以是函数的调用1
2
3var obj = {"a":1,"b":2};
var str = `the result is ${obj.a+obj.b}`;
//进行加法运算 结果:the result is 31
2
3
4
5function fn() {
return 3;
}
var str = ` ${ fn() }`
//函数fn的调用,结果: 3新特性:标签模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16var name = "张三";
var height = 1.8;
//tagFn 自定义标签名 可随意
tagFn`他叫${name},身高${height}米。`;
//标签+模板字符串
//定义一个函数,作为标签
function tagFn(arr,v1,v2){
console.log(arr);
//结果:[ "他叫",",身高","米。" ]
console.log(v1);
//结果:张三
console.log(v2);
//结果:1.8
} - ${}后边没数字 打印arr会默认为空字符串
- 首先是tagFn函数,是我们自定义的一个函数,它有三个参数分别是arr,v1,v2。函数tagFn的调用方式跟以往的不太一样,以往我们使用括号( )表示函数调用执行,这一次我们在函数名后面直接加上一个模板字符串
- 用处理多语言转换
1
2//标签模板
tagFn`他叫${name},身高${height}米。`; - 这样就是标签模板,你可以理解为标签函数+模板字符串,这是一种新的语法规范。
- 接下来我们继续看函数的3个参数,从代码的打印结果我们看到它们运行后对应的结果,arr的值是一个数组:[ “他叫” , “,身高” , “米。” ],而v1的值是变量name的值:“张三”,v2的值是变量height的值:1.8。
- 内容是模板字符串中除了${ }以外的其他字符,按顺序组成了数组的内容,所以arr的值是[ “他叫”, “,身高” , “米。” ];第2,3个参数则是模板字符串中对应次序的变量name和height的值。
ES6还为字符串String类扩展了不少函数
新特性:repeat函数
repeat( )函数:将目标字符串重复N次,返回一个新的字符串,不影响目标字符串。重复3次后返回一个新字符串赋值给name2,name1不受影响,所以name1的值不变。1
2
3
4
5
6
7
8
9var name1 = "张三"; //目标字符串
var name2 = name1.repeat(3);
//变量name1被重复三次;
console.log(name1);
//结果:张三
console.log(name2);
//结果:张三张三张三新特性:includes函数
includes( )函数:判断字符串中是否含有指定的子字符串,返回true表示含有和false表示未含有。第二个参数选填,表示开始搜索的位置。1
2
3
4
5
6
7
8
9var name = "我的技术博客"; //目标字符串
name.includes('技');
//true, 含有
name.includes('你');
//false, 不含有
name.includes('啊',1);
//false, 从第2个字符开始搜索, 不含有 - 传统的做法我们可以借助indexOf( )函数来实现,如果含有指定的字符串,indexOf( )函数就会子字符串首次出现的位置,不含有,则返回-1。我们通过返回值是否为-1来判断字符串中是否含有指定的子字符串,但是,我们现在可以用includes( )函数代替indexOf( )函数,因为它的返回值更直观(true或false),况且我们并不关心子字符串出现的位置。
新特性:startsWith函数
startsWith( )函数:判断指定的子字符串是否出现在目标字符串的开头位置,第二个参数选填,表示开始搜索的位置。1
2
3
4
5
6
7
8
9
10var name = "我的技术博客"; //目标字符串
name.startsWith('我');
//true,出现在开头位置
name.startsWith('技');
//false,不是在开头位置
name.startsWith('的',1);
//true,从第2个字符开始 - 我们如果判断字符串是否以某个子字符串开头,就可以直接使用startsWith( )函数即可,
- 若要从第一个字符开始搜索,参数为0或者为空(默认从第一个字符开始搜索)。
新特性:endsWith函数
endsWith( )函数:判断子字符串是否出现在目标字符串的尾部位置,第二个参数选填,表示针对前N个字符1
2
3
4
5
6
7
8
9
10
11
12
13var name = "我的技术博客"; //目标字符串
name.endsWith('我');
//false,不在尾部位置
name.endsWith('客');
//true,在尾部位置
name.endsWith('客',5);
//false,只针对前5个字符
name.endsWith('博',5);
//true,针对前5个字符新特性:codePointAt函数
- javascript中,一个字符固定为2个字节,对于那些需要4个字节存储的字符,javascript会认为它是两个字符,此时它的字符长度length为2。如字符:”𠮷”,就是一个需要4个字节存储,length为2的字符。这会有什么问题呢?对于4字节的字符, javascript无法正确读取字符,我们来试试看。 javascript中,一个字符固定为2个字节,对于那些需要4个字节存储的字符,javascript会认为它是两个字符,此时它的字符长度length为2。如字符:”𠮷”,就是一个需要4个字节存储,length为2的字符。这会有什么问题呢?对于4字节的字符, javascript无法正确读取字符,我们来试试看。
1
2
3
4
5
6
7
8
9
10
11var str1 = "前端";
var str2 = "𠮷";
str1.length; //length为2
str2.length; //length为2
str1.charAt(0); //前
str1.charAt(1); //端
str2.charAt(0); //'�'
str2.charAt(1); //'�' - 可以看到,str1和str2的长度length都是2,因为字符:”𠮷”是一个4字节的字符,使用charAt函数(charAt() 方法可返回指定位置的字符)能正确读取字符串str1的字符,但无法正确读取4个字节的字符,此时返回结果出现了乱码。
但是,如果我们使用ES6给我们提供的codePointAt( )函数,就可以处理这种4个字节的字符了,我们来看看怎么使用:1
2var str = "𠮷";
str.codePointAt(); //结果:134071 - 对于这个长度length为2字符:”𠮷”,codePointAt( )方法可以正确地识别出它是个4个字节的字符,并且能正确地返回它的码点的十进制数:134071,这个数字抓换成16进制就是20bb7,对应的Unicode编码则是\u20bb7。
- 什么?十进制的数字134071就是对应4个字节的字符:”𠮷”了?能不能验证一下?通过134071这个数字反推回去,得到字符:”𠮷”?
新特性:String.fromCodePoint函数
- String.fromCodePoint( )函数:函数的参数是一个字符对应的码点,返回的结果就是对应的字符,哪怕这个字符是一个4字节的字符,也能正确实现。
- 正好可以利用上面得到的10进制数字134071反推一下。
1
String.fromCodePoint(134071); //结果:"𠮷"
- 得到了我们预期的结果:”𠮷”;同时也证明了上面的codePointAt( )函数能正确读取4个字节的字符
新特性:String.raw函数
1
2
3
4
5
6
7
8
9
10
11
12
13String.raw `Hi\n!`;
// "Hi\\n!",这里得到的不是 Hi 后面跟个换行符,而是跟着 \ 和 n 两个字符
String.raw `Hi\u000A!`;
// "Hi\\u000A!",同上,这里得到的会是 \、u、0、0、0、A 6个字符,
// 任何类型的转义形式都会失效,保留原样输出,不信你试试.length
let name = "Bob";
String.raw `Hi\n${name}!`;
// "Hi\\nBob!",内插表达式还可以正常运行
String.raw({raw: "test"}, 0, 1, 2);
// "t0e1s2t",我认为你通常不需要把它当成普通函数来调用 - \n被识别为\和n两个字符,失去换行的效果,直接输出,这就是String.raw( )的功能。它常用来作为一个模板字符串的处理函数,也就是直接在后面加一个模板字符串。
ES2017中新的字符串方法:padStart 和 padEnd
- ES7推出了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart用于头部补全,padEnd用于尾部补全。
- padStart和padEnd一共接受两个参数,第一个参数用来指定字符串的最小长度,第二个参数是用来补全的字符串。
1 | //如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串 |