工作日的推送尝试一下在晚上发,一个是考虑大家下班了放学了,心情轻松愉悦,适合阅读;另一个是上班时间情绪紧绷,没有心思也没有时间去完整地读完这种技术类的文章。(即便通俗易懂)

第六节,开讲啦......

学过上一节的解构赋值就知道,ES6确实给我们带来不少方便,但是ES6的方便之处远不止这些,今天又带来一个很实用的东西:字符串的扩展。

字符串的扩展

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

新特性:模板字符串

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

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

上面最后一句代码实现将变量name和occupation插入字符串中,这种写法没什么不好,只是数据一旦多起来就很繁琐,你会看到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}`;    //对象obj的属性    //结果:the result is 3.

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

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

除了模板字符串和标签模版,ES6还为字符串String类扩展了不少函数。我们一起来学习它们:

新特性:repeat函数

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

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

    console.log(name1);     //结果:前端君

    console.log(name2);    //结果:前端君前端君前端君

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

新特性:includes函数

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函数

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

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

    name.startsWith('前');     //true,出现在开头位置

    name.startsWith('端');     //false,不是在开头位置

    name.startsWith('端',1);     //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.fromCodePoint函数

String.fromCodePoint( )函数:函数的参数是一个字符对应的码点,返回的结果就是对应的字符,哪怕这个字符是一个4字节的字符,也能正确实现。

正好可以利用上面得到的10进制数字134071反推一下。

    String.fromCodePoint(134071); //结果:"????"

得到了我们预期的结果:"????";同时也证明了上面的codePointAt( )函数能正确读取4个字节的字符。

新特性: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编码的知识。

第六节:ES6为字符串String带来哪些好玩的特性?相关推荐

  1. 青少年学python第六节_青少年学Python(第2册)

    本书根据中小学学生的特点和学习能力编排Python与人工智能教学的内容,寓教于乐.和本书配套的还有作者研发的"中小学编程智能教学平台",平台教学资源丰富,智能化程度高,配有大量的教 ...

  2. Java学习笔记(六)--字符串String类

    文章目录 字符串 一.String 类 1.1 声明字符串 1.2 创建字符串 二.连接字符串 2.1 连接多个字符串 2.2 连接其他数据类型 三.获取字符串信息 3.1 获取字符串长度 3.2 字 ...

  3. Python编程基础:第六节 math包的基础使用Math Functions

    第六节 math包的基础使用 前言 实践 前言 我们通常会对数值型变量进行计算,这里我们给出一些常用的函数用于辅助你的计算过程.常用的数学计算函数均在math包. 实践 首先我们导入math包,并定义 ...

  4. 第六节:Pytorch实现全连接神经网络

    第六节:Pytorch实现全连接神经网络 前面的五节中,我们讲解了使用PyTorch搭建一个神经网络中需要的需要各种技巧,包括:网络的搭建.选择不同的实践技巧(优化器选择.学习率下降等等)以及可视化训 ...

  5. Go 学习笔记(31)— 字符串 string、字符 rune、字节 byte、UTF-8 和 Unicode 区别以及获取字符串长度

    1. 字符串 string 类型 Go 语言中字符串的内部实现使用 UTF-8 编码,通过 rune 类型,可以方便地对每个 UTF-8 字符进行访问.当然, Go 语言也支持按照传统的 ASCII ...

  6. ES6笔记 -- 字符串拓展

    字符串拓展 Unicode 相关 JS 允许使用/uxxxx的Unicode方式显示字符, 但是只限于码点在/u0000~/uFFFF之间, 超过该范围的码点必须用双字节形式表示 ES6 中, 将码点 ...

  7. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  8. C++ primer三章二节标准库类型string

    标准库类型string 标准库类型string表示可变长的字符序列,使用#include<string>引入头文件,string定义在命名空间std中. 定义和初始化string对象 如何 ...

  9. 【Python基础知识-pycharm版】第六节-控制语句

    第六节 控制语句 选择结构 多分支选择结构 选择结构的嵌套 循环结构 while循环 for循环和可迭代对象遍历 range 对象 嵌套循环 break continue else语句 循环代码优化 ...

最新文章

  1. C语言:随笔7--预处理命令
  2. AS3 Socket 基础知识(很全面)
  3. 全向飞行器的设计与制作-学生初步汇报内容
  4. html将字符转成浮点数,stm32用串口接收到数据,怎么把接收到的字符串转换成浮点数?...
  5. VS2015调试时没有启动IIS Express Web服务器 或者停止调试时 IIS Express 跟着关闭
  6. 浅谈tcp的三次握手和四次挥手的理解
  7. 2021奥运经济蓝皮书
  8. 中国石化:五年要建充换电站5000座
  9. kafka报错:creating broker listeners from xxx unable to parse xxx:9092 to a broker endpoint
  10. GoLand External Libraries不展示Go Modules
  11. java实现文件的复制
  12. 【文本分类】采用同义词的改进TF-IDF权重的文本分类
  13. Failure obtaining db row lock: No row exists in table QRTZ_LOCKS for lock named
  14. 说说技术总监的三板斧(十年肺腑之言)
  15. 第二季《中国好声音》
  16. cpu是几核的怎么查看
  17. elment表格sort-method自定义排序功能
  18. 计算机较为安全的硬盘分区,电脑到底该不该进行硬盘分区?原来我们都被骗了!...
  19. linux 常用命令-du统计文件、文件夹命令的使用详情
  20. 如何重命名文件名,设置编号位数及位置

热门文章

  1. 钉钉微应用怎么进入_钉钉微应用如何打开本地app (Android)-问答-阿里云开发者社区-阿里云...
  2. 安徽省智慧政务新模式及典型应用
  3. 宏基因组大数据分析的质量控制流程规范
  4. 作者:郭绍光(1985-),男,中国科学院上海天文台工程师
  5. Sping(一)——IOC/DI
  6. 分库分表产生的问题,及注意事项
  7. mysql密码过期问题
  8. SQL Server 2008——SQL命令INSERT
  9. Jira-Clone与发邮件的使用
  10. Oracle 自动备份详细步骤