ES6之字符串String新特性

JavaScript字符串处理


一、模板字符串

模板字符串是ES6的一个新特性,传统的字符串实现拼接的时候,要将变量插入字符串中,语法是这样的:

let name = "Jacky";
let occupation = "doctor";
let str = "He is "+ name +",he is a "+ occupation; // 传统字符串拼接

上面最后一句代码实现将变量 nameoccupation 插入字符串中,这种写法没什么不好,只是数据一旦多起来就很繁琐,你会看到N多个加号+,N多个引号"",ES6给了我们另一种更简捷的写法,来看一下下面这段小代码:

let name = "Jacky";
let occupation = "doctor";
let str = `He is ${name},he is a ${occupation}`;//模板字符串拼接

对比两段拼接的代码,模板字符串使得我们不再需要反复使用双引号(或者单引号)了;而是改用反引号标识符(`),插入变量的时候也不需要再使用加号(+)了,而是把变量放入${ }即可。

注意的地方

1. 可以定义多行字符串
传统的多行字符串写法:

let str = "write once ," +
          "run anywhere";

模板字符串的写法:

let str = `write once ,
           run anywhere`;

直接换行即可,但是要注意的是:所有的空格和所进都会被保留在输出中。如果控制台输出字符串str的话,代码上换了行,控制台输出的时候也会换行。
.

2. ${ }中可以放任意的javascript表达式
${ }中可以是运算表达式

var a = 1;
var b = 2;
var str = `the result is ${a+b}`;// the result is 3

${ }中可以是对象的属性

var obj = {"a":1,"b":2};
var str = `the result is ${obj.a+obj.b}`;// the result is 3.

${ }中可以是函数的调用

function fn() {
    return 3;
}
var str = `the result is ${ fn() }`;// the result is 3

二、标签模板

这里的模板指的是上面讲的字符串模板,用反引号定义的字符串;而标签,则指的是一个函数,一个专门处理模板字符串的函数。

var name = "张三";
var height  = 1.8;

tagFn`他叫${name},身高${height}米。`; //标签+模板字符串

//定义一个函数,作为标签
function tagFn(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给我们带来的一种新语法,它常用来实现过滤用户的非法输入和多语言转换,这里不展开讲解。因为一旦我们掌握了标签模板的用法后,以后就可以好好利用它的这个特性,再根据自己的需求要来实现各种功能了。


三、repeat函数

将目标字符串重复N次,返回一个新的字符串,不影响目标字符串。

var name1 = "张三";  // 目标字符串
var name2 =  name1.repeat(3); // 变量name1被重复三次;

console.log(name1); // 张三
console.log(name2);// 张三张三张三

重复3次后返回一个新字符串赋值给name2,name1不受影响,所以name1的值不变。


四、includes函数

判断字符串中是否含有指定的子字符串,返回true表示含有和false表示未含有。第二个参数选填,表示开始搜索的位置。

    var name = "张三";    //目标字符串
    name.includes('三');   
    //true, 含有

    name.includes('web');  
    //false, 不含有

    name.includes('张',1); 
    //false, 从第2个字符开始搜索, 不含有

传统的做法我们可以借助indexOf( )函数来实现,如果含有指定的字符串,indexOf( )函数就会子字符串首次出现的位置,不含有,则返回-1。我们通过返回值是否为-1来判断字符串中是否含有指定的子字符串,但是,我们现在可以用includes( )函数代替indexOf( )函数,因为它的返回值更直观(true或false),况且我们并不关心子字符串出现的位置。

注意,上面最后一句代码,第二个参数为1,表示从第2个字符“三“开始搜索,第一个字符”张“的位置是0;


五、startsWith函数

判断指定的子字符串是否出现在目标字符串的开头位置,第二个参数选填,表示开始搜索的位置。

var name = "张三李四";  //目标字符串

name.startsWith('张');  //true,出现在开头位置
name.startsWith('三');  //false,不是在开头位置
name.startsWith('三',1); //true,从第2个字符开始

我们如果判断字符串是否以某个子字符串开头,就可以直接使用startsWith( )函数即可,同样,第二个参数为1表示从第2个字符开始搜索。若要从第一个字符开始搜索,参数应该为0或者为空(默认从第一个字符开始搜索)。


六、endsWith函数

判断子字符串是否出现在目标字符串的尾部位置,第二个参数选填,表示针对前N个字 var name = “张三李四”; //目标字符串

var name = "张三李四";  //目标字符串

name.endsWith('张'); //false,不在尾部位置
name.endsWith('四');  //true,在尾部位置
name.endsWith('四',3);  //false,只针对前3个字符
name.endsWith('四',4); //true,针对前4个字符

七、String.raw函数

看函数名raw是未加工的的意思,正如这个函数的作用一样:返回字符串最原始的样貌,即使字符串中含有转义符,它都视而不见,直接输出。举个例子:

未经String.raw( )处理的字符串:

console.log(`hello\nworld`);
//输出:hello
//      world

\n会被识别为换行符,实现换行效果,而经过String.raw( )的同一个字符串的结果是:

console.log(String.raw`hello\nwolrd`);
//输出:hello\nwolrd

\n被识别为\n两个字符,失去换行的效果,直接输出,这就是String.raw( )的功能。它常用来作为一个模板字符串的处理函数,也就是直接在后面加一个模板字符串。

posted @ 2022-07-20 18:17  猫老板的豆  阅读(124)  评论(0编辑  收藏  举报