es6 字符串String的扩展(实例讲解)
新特性:模板字符串
传统字符串
letname="Jacky"; letoccupation="doctor"; //传统字符串拼接 letstr="Heis"+name+",heisa"+occupation;
es6简洁的字符串拼接
letname="Jacky"; letoccupation="doctor"; //模板字符串拼接 letstr=`Heis${name},heisa${occupation}`;
对比两段拼接的代码,模板字符串使得我们不再需要反复使用双引号(或者单引号)了;而是改用反引号标识符(`),插入变量的时候也不需要再使用加号(+)了,而是把变量放入${}即可。
使用时要注意
1、可以定义多行字符串
传统的多行字符串写法:
letstr="writeonce,"+ "runanywhere";
模板字符串的写法:
letstr=`writeonce, runanywhere`;
直接换行即可,但是要注意的是:所有的空格和所进都会被保留在输出中。如果控制台输出字符串str的话,代码上换了行,控制台输出的时候也会换行。
2、${}中可以放任意的javascript表达式
${}中可以是运算表达式
vara=1; varb=2; varstr=`theresultis${a+b}`; //进行加法运算结果:theresultis3
${}中可以是对象的属性
varobj={"a":1,"b":2}; varstr=`theresultis${obj.a+obj.b}`; //对象obj的属性 //结果:theresultis3.
${}中可以是函数的调用
functionfn(){ return3; } varstr=`theresultis${fn()}`; //函数fn的调用,结果:theresultis3
标签模板
这里的模板指的是上面讲的字符串模板,用反引号定义的字符串;而标签,则指的是一个函数,一个专门处理模板字符串的函数。
varname="张三"; varheight=1.8; tagFn`他叫${name},身高${height}米。`; //标签+模板字符串 //定义一个函数,作为标签 functiontagFn(arr,v1,v2){ console.log(arr); //结果:["他叫",",身高","米。"] console.log(v1); //结果:张三 console.log(v2); //结果:1.8 }
以上代码有两处要仔细讲解的,首先是tagFn函数,是我们自定义的一个函数,它有三个参数分别是arr,v1,v2。函数tagFn的调用方式跟以往的不太一样,以往我们使用括号()表示函数调用执行,这一次我们在函数名后面直接加上一个模板字符串,如下面的代码:
tagFn`他叫${name},身高${height}米。`;
这样就是标签模板,你可以理解为标签函数+模板字符串,这是一种新的语法规范。
接下来我们继续看函数的3个参数,从代码的打印结果我们看到它们运行后对应的结果,arr的值是一个数组:["他叫",",身高","米。"],而v1的值是变量name的值:“张三”,v2的值是变量height的值:1.8。
你是否看出规律了:第一个参数arr是数组类型,它是内容是模板字符串中除了${}以外的其他字符,按顺序组成了数组的内容,所以arr的值是["他叫",",身高","米。"];第2,3个参数则是模板字符串中对应次序的变量name和height的值。
标签模板是ES6给我们带来的一种新语法,它常用来实现过滤用户的非法输入和多语言转换,这里不展开讲解。因为一旦我们掌握了标签模板的用法后,以后就可以好好利用它的这个特性,再根据自己的需求要来实现各种功能了。
ES6新的String函数
repeat()函数:将目标字符串重复N次,返回一个新的字符串,不影响目标字符串。
varname1="王汉炎";//目标字符串 varname2=name1.repeat(3); //变量name1被重复三次; console.log(name1); //结果:王汉炎 console.log(name2); //结果:王汉炎王汉炎王汉炎
includes()函数:判断字符串中是否含有指定的子字符串,返回true表示含有和false表示未含有。第二个参数选填,表示开始搜索的位置。
varname="王汉炎";//目标字符串 name.includes('炎'); //true,含有 name.includes('web'); //false,不含有 name.includes('王',1); //false,从第2个字符开始搜索,不含有
传统的做法我们可以借助indexOf()函数来实现,如果含有指定的字符串,indexOf()函数就会子字符串首次出现的位置,不含有,则返回-1。我们通过返回值是否为-1来判断字符串中是否含有指定的子字符串,但是,我们现在可以用includes()函数代替indexOf()函数,因为它的返回值更直观(true或false),况且我们并不关心子字符串出现的位置。
startsWith()函数:判断指定的子字符串是否出现在目标字符串的开头位置,第二个参数选填,表示开始搜索的位置。
varname="王汉炎";//目标字符串 name.startsWith('王'); //true,出现在开头位置 name.startsWith('汉'); //false,不是在开头位置 name.startsWith('汉',1); //true,从第2个字符开始
endsWith()函数:判断子字符串是否出现在目标字符串的尾部位置,第二个参数选填,表示针对前N个字符。
varname="我就是王汉炎";//目标字符串 name.endsWith('我'); //false,不在尾部位置 name.endsWith('炎'); //true,在尾部位置 name.endsWith('炎',5); //false,只针对前5个字符 name.endsWith('炎',6); //true,针对前6个字符
javascript中,一个字符固定为2个字节,对于那些需要4个字节存储的字符,javascript会认为它是两个字符,此时它的字符长度length为2。如字符:"