ES6基础之字符串和函数的拓展详解


Posted in Javascript onAugust 22, 2019

本文实例讲述了ES6基础之字符串和函数的拓展。分享给大家供大家参考,具体如下:

字符串的拓展

1.ES6为字符串添加了遍历器接口,因此可以使用for...of循环遍历字符串

2.字符串新增的 includes()、startsWith()、endsWidth() 三个方法用于判断某一字符串是否包含于另一字符串

  • includes():返回布尔值,表示源字符串中是否包含参数字符串。
  • startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
  • endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。

3.新增 repeat() 方法, 该方法返回一个新字符串,不是对原字符串操作,表示将原字符串重复n次。

let str = 'abc';
str.repeat(3) //abcabcabc 
str //abc

ps:该方法参数为正整数,如果为负数会报错,小数向下取整;

4.新增 padStart(),padEnd() 方法,用于补全字符串,该方法返回一个新字符串,不是对原字符串操作,传入两个参数,第一个参数用来指定字符串的最小长度,第二个参数是用来补全的字符串(缺省的话默认空格补全)。(ps:如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串);

let str = 'abc';
str.padStart(2, 'abc') // 'abc'
str.padEnd(2, 'abc') // 'abc'

5.模板字符串··(esc下面的那个按键),可以摆脱传统的字符串拼接的模式,直接将变量(表达式,对象的引用,函数等)写在模板字符串中输出

let str = 'world';
let html = `hello ${str}`;
html //hello wrold

ps:所有模板字符串的空格和换行,都是被保留的,可以使用trim方法消除换行。

6.标签模板,即模板字符串紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串,这中方式被称为“标签模板”,“标签”指的就是函数,紧跟在后面的模板字符串就是它的参数

console.log `123`
// 等同于
console.log (123)

7.如果模板字符里面有变量,会将模板字符串先处理成多个参数,再调用函数;

var a = 5;
var b = 10;
function tag(s, v1, v2) {
 console.log(s)
 console.log(v1);
 console.log(v2);
}
tag`Hello ${ a + b } world ${ a * b }`;
//['Hello','world','']
//15
//50

可以看出,tag函数第一个参数是一个数组,数组的成员是模板字符串中那些没有变量替换的部分,其他参数,都是模板字符串各个变量被替换后的值;

8.再来一个例子,看看标签模板的使用方法:

var total = 30;
var msg = passthru`The total is ${total} (${total*1.05} with tax)`;
function passthru(literals) {
 var result = '';
 var i = 0;
 while (i < literals.length) {
  result += literals[i++];
  if (i < arguments.length) {
   result += arguments[i];
  }
 }
 return result;
}

上述例子中,参数 literals 实际上是 <code> ["The total is "," ("," with tax)"] </code> , 函数内部 arguments 的值是 <code>{ "0" : ["The total is "," ("," with tax)"] , "1" : 30 , "2" : 31.5 }</code>,通过以上梳理,可以将各个参数按照原来的位置拼合回去,最终得到输出为<code>"The total is 30 (31.5 with tax)"</code>

ps:在使用标签模板的时候,要注意参数的位置,可根据自己实际的需求进行修改,返回正确的结果;

函数的拓展

1.ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面,一目了然,十分实用

function say( x , y = 'World') {
  console.log( x , y);
}
say('Hello') // Hello World
say('Hello','Kite') //Hello Kite

2.函数参数默认已经声明,不能再用 let 或者 const 声明,而且不能有同名参数

3.一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失;

var x = 1;
function f(x, y = x) {
 console.log(y);
}
f(2) // 2

上面例子中,参数y的默认值等于变量x。调用函数f时,参数形成一个单独的作用域。在这个作用域里面,默认值变量x指向第一个参数x,而不是全局变量x,所以输出是2;

let x = 1;
function f( y = x ) {
 let x = 2;
 console.log(y);
}
f() // 1

上面例子中,函数f调用时,参数y=x形成一个单独的作用域。这个作用域里面,变量x本身没有定义,所以指向外层的全局变量x。函数调用时,函数体内部的局部变量x影响不到默认值变量x;

4.函数声明时,可以将某个参数默认值设为undefined,表明这个参数是可以省略的;

5.rest 参数(形式为...变量名),用于获取函数的多余参数,该变量是一个数组,用于将多余的参数放入该数组中。(rest 参数之后不能再有其他参数,它只能是函数的最后一个参数,否则会报错)

function func(...params){
  console.log(params)
}
func(1,2,3) // [1,2,3]
function func( x , ...params){
  console.log(params)
}
func(1,2,3) // [2,3]

6.箭头函数(=>),ES6 允许使用“箭头”(=>)定义函数,这种写法相比较 ES5 定义 function 看起来简洁得多;

var func = x => x 
//等同于
var func = function func(x) {
  return x;
};

7.如果箭头函数没有参数或者有多个参数的话,则需要加上()来进行声明;

var func = () => 'Hello World';
//等同于
var func = function func() {
 return 'Hello World';
};
var func = ( x , y ) => x + y
//等同于
var func = function func(x, y) {
 return x + y;
};

8.如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回;

var func = ( x , y ) => { return x + y; }

9.如果箭头函数直接返回一个对象,必须在对象外面加上括号;

var func = ( x , y ) => ({ x : x , y : y })

10.箭头函数使用时必须注意以下几个问题:

函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象;

function foo() {
 setTimeout(() => {
  console.log('id:', this.id);
 }, 100);
}
var id = 21;
foo.call({ id: 42 }); //42

上面代码中,setTimeout的参数是一个箭头函数,这个箭头函数的定义生效是在foo函数生成时,而它的真正执行要等到100毫秒后。如果是普通函数,执行时this应该指向全局对象window,这时应该输出21。但是,箭头函数导致this总是指向函数定义生效时所在的对象(本例是{id: 42}),所以输出的是42。

  • 箭头函数不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误;
  • 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替
  • 不可以使用yield命令,因此箭头函数不能用作 Generator 函数。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery.clean使用方法及思路分析
Jan 07 Javascript
中文路径导致unitpngfix.js不正常的解决方法
Jun 26 Javascript
详解JavaScript函数绑定
Aug 18 Javascript
JavaScript中instanceof运算符的用法总结
Nov 19 Javascript
node.js中的fs.readFileSync方法使用说明
Dec 15 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
Dec 07 Javascript
jquery滚动条插件slimScroll使用方法
Feb 09 Javascript
vue.js国际化 vue-i18n插件的使用详解
Jul 07 Javascript
AngularJS ui-router刷新子页面路由的方法
Jul 23 Javascript
elementUI多选框反选的实现代码
Apr 03 Javascript
微信小程序日历弹窗选择器代码实例
May 09 Javascript
vue 实现锚点功能操作
Aug 10 Javascript
node实现爬虫的几种简易方式
Aug 22 #Javascript
vue router动态路由设置参数可选问题
Aug 21 #Javascript
Element ui 下拉多选时新增一个选择所有的选项
Aug 21 #Javascript
js时间转换毫秒的实例代码
Aug 21 #Javascript
VUE的history模式下除了index外其他路由404报错解决办法
Aug 21 #Javascript
详解webpack引用jquery(第三方模块)的三种办法
Aug 21 #jQuery
jqGrid表格底部汇总、合计行footerrow处理
Aug 21 #Javascript
You might like
在PHP中读取和写入WORD文档的代码
2008/04/09 PHP
php flush类输出缓冲剖析
2008/10/19 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
2014/10/11 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
深入浅析AngularJS和DataModel
2016/02/16 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
2016/09/01 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
使用Angular CLI从蓝本生成代码详解
2018/03/24 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
前端性能优化建议
2020/09/17 Javascript
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
python如何使用unittest测试接口
2018/04/04 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
python将unicode和str互相转化的实现
2020/05/11 Python
Python3交互式shell ipython3安装及使用详解
2020/07/11 Python
浅谈python锁与死锁问题
2020/08/14 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
卫校中专生个人自我评价
2013/09/19 职场文书
python urllib库的使用详解
2021/04/13 Python
Python 实现Mac 屏幕截图详解
2021/10/05 Python