ES6新特性之函数的扩展实例详解


Posted in Javascript onApril 01, 2017

本文实例讲述了ES6新特性之函数的扩展。分享给大家供大家参考,具体如下:

一、函数参数默认值

1. ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。

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

这种写法有两个好处:首先,阅读代码的人,可以立刻意识到哪些参数是可以省略的,不用查看函数体或文档;其次,有利于将来的代码优化,即使未来的版本在对外接口中,彻底拿掉这个参数,也不会导致以前的代码无法运行。

参数变量是默认声明的,所以不能用let或const再次声明。否则会报错。

2. 参数默认值可以与解构赋值的默认值,结合起来使用。

function foo({x, y = 5}) {
  console.log(x, y);
}
foo({}) // undefined, 5
foo({x: 1}) // 1, 5
foo({x: 1, y: 2}) // 1, 2
foo() // TypeError: Cannot read property 'x' of undefined

通常情况下,定义了默认值的参数,应该是函数的尾参数。因为这样比较容易看出来,到底省略了哪些参数。如果非尾部的参数设置默认值,实际上这个参数是没法省略的。

指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真。

(function (a) {}).length // 1
(function (a = 5) {}).length // 0
(function (a, b, c = 5) {}).length // 2

二、rest参数

ES6引入rest参数(形式为“...变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

function add(...values) {
  let sum = 0;
  for (var val of values) {
    sum += val;
  }
  return sum;
}
add(2, 5, 3) // 10

上面代码的add函数是一个求和函数,利用rest参数,可以向该函数传入任意数目的参数。

注意,rest参数之后不能再有其他参数(即只能是最后一个参数),否则会报错。

函数的length属性,不包括rest参数。

三、扩展运算符

扩展运算符(spread)是三个点(...)。它好比rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。

console.log(...[1, 2, 3])
// 1 2 3
console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5
[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]

四、箭头函数

ES6允许使用“箭头”(=>)定义函数。箭头函数前面是输入,后面是输出。inputs => outputs

var f = v => v;
//上面的箭头函数等同于:
var f = function(v) {
 return v;
};

如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。

var f = () => 5;
// 等同于
var f = function () { return 5 };
var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
 return num1 + num2;
};

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

var sum = (num1, num2) => { return num1 + num2; }
//由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号。
var getTempItem = id => ({ id: id, name: "Temp" });

箭头函数可以与变量解构结合使用。

const full = ({ first, last }) => first + ' ' + last;
// 等同于
function full(person) {
 return person.first + ' ' + person.last;
}

箭头函数的一个用处是简化回调函数。

// 正常函数写法
[1,2,3].map(function (x) {
 return x * x;
});
// 箭头函数写法
[1,2,3].map(x => x * x);

下面是rest参数与箭头函数结合的例子。

const numbers = (...nums) => nums;
numbers(1, 2, 3, 4, 5)
// [1,2,3,4,5]

箭头函数有几个使用注意点。

(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。
(4)不可以使用yield命令,因此箭头函数不能用作Generator函数。

上面四点中,第一点尤其值得注意。this对象的指向是可变的,但是在箭头函数中,它是固定的。

五、函数参数的尾逗号

ECMAScript 2017将函数的最后一个参数有尾逗号(trailing comma)。

此前,函数定义和调用时,都不允许最后一个参数后面出现逗号。

function clownsEverywhere(
  param1,
  param2
) { /* ... */ }

上面代码中,如果在param2或bar后面加一个逗号,就会报错。

这样的话,如果以后修改代码,想为函数clownsEverywhere添加第三个参数,就势必要在第二个参数后面添加一个逗号。这对版本管理系统来说,就会显示,添加逗号的那一行也发生了变动。这看上去有点冗余,因此新的语法允许定义和调用时,尾部直接有一个逗号。

function clownsEverywhere(
  param1,
  param2,
) { /* ... */ }

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

Javascript 相关文章推荐
js实现无需数据库的县级以上联动行政区域下拉控件
Aug 14 Javascript
javascript 用函数语句和表达式定义函数的区别详解
Jan 06 Javascript
jQuery实现标题有打字效果的焦点图代码
Nov 16 Javascript
Bootstrap学习笔记之css组件(3)
Jun 07 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
Aug 15 Javascript
H5移动端适配 Flexible方案
Oct 24 Javascript
微信小程序 progress组件详解及实例代码
Oct 25 Javascript
基于JavaScript 性能优化技巧心得(分享)
Dec 11 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
Dec 04 jQuery
vue踩坑记-在项目中安装依赖模块npm install报错
Apr 02 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
Dec 04 Javascript
微信小程序实用代码段(收藏版)
Dec 17 Javascript
vue-cli的webpack模板项目配置文件分析
Apr 01 #Javascript
ES6新特性之模块Module用法详解
Apr 01 #Javascript
Vue.js实战之组件之间的数据传递
Apr 01 #Javascript
ES6新特性之解构、参数、模块和记号用法示例
Apr 01 #Javascript
jQuery UI Grid 模态框中的表格实例代码
Apr 01 #jQuery
前端自动化开发之Node.js的环境搭建教程
Apr 01 #Javascript
ES6新特性之数组、Math和扩展操作符用法示例
Apr 01 #Javascript
You might like
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
Laravel 5框架学习之Blade 简介
2015/04/08 PHP
joomla组件开发入门教程
2016/05/04 PHP
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
Extjs学习笔记之七 布局
2010/01/08 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
JavaScript 冒泡排序和选择排序的实现代码
2016/09/03 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
详解Vue底部导航栏组件
2019/05/02 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
python实现类之间的方法互相调用
2018/04/29 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
Python中断多重循环的思路总结
2019/10/04 Python
使用python turtle画高达
2020/01/19 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
serialVersionUID具有什么样的特征
2014/02/20 面试题
大学生表扬信范文
2014/01/09 职场文书
如何写一封打动人心的求职信
2014/02/17 职场文书
设计大赛策划方案
2014/06/13 职场文书
小学清明节活动总结
2014/07/04 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
Python使用scapy模块发包收包
2021/05/07 Python