ES6为字符串String

字符串的扩展

 简答说,ES6对字符串新增了一些函数和操作规范,使得开发者对字符串的操作更加方便,以往需要借助其他javascript代码才能实现的效果,现在利用这些函数即可快速实现。

新特性:模板字符串

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

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

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

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

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

 以上就是模板字符串的用法,下面来介绍使用时要注意的地方:

 1、可以定义多行字符串

传统的多行字符串写法:

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

模板字符串的写法:

1  let str = `write once ,
2                run anywhere`;

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

 2、${ }中可以放任意的javascript表达式

${ }中可以是运算表达式

1   var a = 1;
2     var b = 2;
3     var str = `the result is ${a+b}`;
4     //进行加法运算 结果:the result is 3

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

  var obj = {"a":1,"b":2};
    var str = `the result is ${obj.a+obj.b}`;
    //对象obj的属性
    //结果:the result is 3.

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

1   function fn() {
2         return 3;
3     }
4     var str = `the result is ${ fn() }`;
5     //函数fn的调用,结果:the result is 3

新特性:标签模板

 标签模板,这个名词不是很好理解,什么是标签模板?不懂没关系,前端君的任务就是负责把知识讲得通俗易懂,这里的模板指的是上面讲的字符串模板,用反引号定义的字符串;而标签,则指的是一个函数,一个专门处理模板字符串的函数。还是不完全理解?没事,继续往下看。

 

 1   var name = "张三";
 2     var height  = 1.8;
 3 
 4     tagFn`他叫${name},身高${height}米。`;
 5     //标签+模板字符串
 6 
 7     //定义一个函数,作为标签
 8     function tagFn(arr,v1,v2){
 9         console.log(arr); 
10         //结果:[ "他叫",",身高","米。" ]
11         console.log(v1); 
12         //结果:张三
13         console.log(v2); 
14         //结果:1.8
15     }

 

以上代码有两处要仔细讲解的,首先是tagFn函数,是我们自定义的一个函数,它有三个参数分别是arr,v1,v2。函数tagFn的调用方式跟以往的不太一样,以往我们使用括号( )表示函数调用执行,这一次我们在函数名后面直接加上一个模板字符串,如下面的代码:

1  tagFn`他叫${name},身高${height}米。`;

  这样就是标签模板,你可以理解为标签函数+模板字符串,这是一种新的语法规范。

  接下来我们继续看函数的3个参数,从代码的打印结果我们看到它们运行后对应的结果,arr的值是一个数组:[ "他叫" ,  ",身高"  ,  "米。" ],而v1的值是变量name的值:“张三”,v2的值是变量height的值:1.8。

新特性:repeat函数    
 
repeat( )函数:将目标字符串重复N次,返回一个新的字符串,不影响目标字符串。

 

1     var name1 = "前端君";  //目标字符串
2     var name2 =  name1.repeat(3);
3     //变量name1被重复三次;
4 
5     console.log(name1); 
6     //结果:前端君
7 
8     console.log(name2);
9     //结果:前端君前端君前端君

 

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

新特性:includes函数

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

 

 

1   var name = "前端君";    //目标字符串
2     name.includes('君');   
3     //true, 含有
4 
5     name.includes('web');  
6     //false, 不含有
7 
8     name.includes('前',1); 
9     //false, 从第2个字符开始搜索, 不含有

 

新特性:startsWith函数

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

 1  var name = "前端君";  //目标字符串
 2 
 3     name.startsWith('前'); 
 4     //true,出现在开头位置
 5 
 6     name.startsWith('端'); 
 7     //false,不是在开头位置
 8 
 9     name.startsWith('端',1); 
10     //true,从第2个字符开始

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

新特性:endsWith函数

 endsWith( )函数:判断子字符串是否出现在目标字符串的尾部位置,第二个参数选填,表示针对前N个字符。

    var name = "我就是前端君";    //目标字符串

    name.endsWith('我');
    //false,不在尾部位置


    name.endsWith('君'); 
    //true,在尾部位置


    name.endsWith('君',5); 
    //false,只针对前5个字符


    name.endsWith('君',6);
    //true,针对前6个字符

  新特性:codePointAt函数

     javascript中,一个字符固定为2个字节,对于那些需要4个字节存储的字符,javascript会认为它是两个字符,此时它的字符长度length为2。如字符:"?",就是一个需要4个字节存储,length为2的字符。这会有什么问题呢?对于4字节的字符, javascript无法正确读取字符,我们来试试看。

   var 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个字节的字符了,我们来看看怎么使用:

   var str = "?";
    str.codePointAt();  //结果:134071

   对于这个长度length为2字符:"?",codePointAt( )方法可以正确地识别出它是个4个字节的字符,并且能正确地返回它的码点的十进制数:134071,这个数字抓换成16进制就是20bb7,对应的Unicode编码则是\u20bb7。(什么是Unicode编码?稍后讲解)。

    什么?十进制的数字134071就是对应4个字节的字符:"?"了?能不能验证一下?通过134071这个数字反推回去,得到字符:"?"?

 可以的,ES6还提供了一个函数给我们来实现这个效果。

 新特性:String.raw函数

  最后讲解的一个函数是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( )的功能。它常用来作为一个模板字符串的处理函数,也就是直接在后面加一个模板字符串。

 不知道学到这里,上面讲的模板字符串和标签模板是否已经忘得差不多了。不过能坚持认真看到这里的同学,算很认真刻苦了!

 Unicode编码

 上面讲解codePointAt()函数的时候提到Unicode编码,对于初学者也许还是很理解,前端君就在这里扩展一下,我们先看看维基百科的解释:

        Unicode(中文:万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。

   想想,为什么有时候收到的邮件会出现乱码?就是因为发邮件的人可能用日文的编码体系,而收邮件的人用的是中文体系,他们对同一个二进制编码值进行显示,采用了不同的编码,导致乱码。这个问题促使了unicode码的诞生。

  好比小强给外国的朋友Peter发了一句:66666,表达很溜很牛的意思。

 但是Peter对这个词的认知不一样(编码体系不一样),无法get到小强想表达的意思,表示很疑惑(出现乱码)。

   最后大家约定,用一种大家都看得懂的方式交流(统一一种编码体系:unicode码),大家都遵守这种交流方式,就能愉快的玩耍了(不会出现乱码,邮件内容正常显示)。

   最后这个小强灵机一动。

本节总结

 总结:ES6给字符串带来了很多实用性的扩展:模板字符串,标签模板,repeat函数、includes函数,startsWith函数,endsWith函数,codePointAt函数,String.fromCodePoint函数,String.raw函数。还顺带学习了一些关于Unicode编码的知识。

 

转载于:https://www.cnblogs.com/queenw/p/7278891.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值