ECMAScript6函数剩余参数(Rest Parameters)


Posted in Javascript onJune 12, 2015

我们知道JS函数内部有个arguments对象,可以拿到全部实参。现在ES6给我们带来了一个新的对象,可以拿到除开始参数外的参数,即剩余参数(废话好多 O(∩_∩)O~)。

这个新的对象和arguments不一样,它是程序员自定义的一个普通标识符,只是需要在前面加上三个点:...

function func(a, ...rest) {
 console.log(a)
 console.log(rest)
}
func(1)
func(1, 2, 3, 4)

注意func的第二个参数rest,前面有三个点。定义好后调用了两次,结果分别如下

ECMAScript6函数剩余参数(Rest Parameters)

可以看到第一次调用时,rest为一个空数组,第二次为[2, 3, 4]。

又比如,在前面定义2个参数

function func(a, b, ...rest) {
 console.log(a, b)
 console.log(rest)
}
func(1, 2)
func(1, 2, 3, 4)

输出结果如下

ECMAScript6函数剩余参数(Rest Parameters)

通过以上两个示例应该已经了解剩余参数的意义了吧。

剩余参数嘛,所以后面就不要再跟其它的参数了,不然会报错

function func(a, ...rest, b) {
 
}

这里在rest后面加了一个参数b,Firefox会报错

ECMAScript6函数剩余参数(Rest Parameters)

当您使用剩余参数后,函数的length属性会发生一些变化

function func(a, b, ...rest) {
}
func.length // 2

即length不包含rest,为2。

有同学会想,剩余参数前面是否可以一个参数都没有呢? 答案是肯定的

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

这里的rest实际和arguments功能差不多,有同学想这不就替代了arguments吗? ECMAScript就是这个打算,在被废弃的ES4里就已经有Rest Parameters(熟悉AS3的同学应该了解),ES4被废弃后,Rest Parameters被保留到了ES6。

请注意,rest不能和arguments一起使用,会报错

function func(...rest) {
 console.log(rest)
 console.log(arguments)
}

Firefox控制台如下

ECMAScript6函数剩余参数(Rest Parameters)

arguments和剩余参数的区别

arguments是一个伪数组(Array-like)
剩余参数是一个真正数组(Array),具有Array.prototype上的所有方法
arguments上有callee,callee上有caller

function func(a, ...rest) {
  console.log(rest instanceof Array)
}
func(1, 2) // true

最后我们以一个剩余参数实际应用作为结束

/*
 * 任意个数相加
 *
 * **示例**
 * sum(1)
 * sum(1, 2)
 * sum(1, 2, 3)
 */
function sum(first, ...rest) {
  var result = first
  var i = 0
  var len = rest.length
  while (i < len) {
    result += rest[i]
    i++
  }
  return result
}

以上所述就是本文的全部内容了,希望大家能喜欢。

Javascript 相关文章推荐
js调用iframe实现打印页面内容的方法
Mar 04 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
浅谈Javascript中的Label语句
Dec 14 Javascript
微信小程序 template模板详解及实例
Feb 21 Javascript
jquery拼接ajax 的json和字符串拼接的方法
Mar 11 Javascript
jQuery实现验证码功能
Mar 17 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
Jun 09 jQuery
Vue.js devtool插件安装后无法使用的解决办法
Nov 27 Javascript
关于axios不能使用Vue.use()浅析
Jan 12 Javascript
Vue的事件响应式进度条组件实例详解
Feb 04 Javascript
JS 实现分页打印功能
May 16 Javascript
谈谈IntersectionObserver懒加载的具体使用
Oct 15 Javascript
ECMAScript6函数默认参数
Jun 12 #Javascript
在JavaScript中操作时间之setYear()方法的使用
Jun 12 #Javascript
简介JavaScript中setUTCSeconds()方法的使用
Jun 12 #Javascript
JS中产生标识符方式的演变
Jun 12 #Javascript
JS中处理时间之setUTCMinutes()方法的使用
Jun 12 #Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
Jun 12 #Javascript
JavaScript中setUTCFullYear()方法的使用简介
Jun 12 #Javascript
You might like
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
一个php导出oracle库的php代码
2009/04/20 PHP
一些 PHP 管理系统程序中的后门
2009/08/05 PHP
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
php合并js请求的例子
2013/11/01 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
javascript 播放器 控制
2007/01/22 Javascript
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
jQuery使用CSS()方法给指定元素同时设置多个样式
2015/03/26 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
轻量级javascript 框架Backbone使用指南
2015/07/24 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
2020/02/11 Javascript
JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】
2020/04/28 Javascript
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
Python中的进程分支fork和exec详解
2015/04/11 Python
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
PyQt5实现暗黑风格的计时器
2019/07/29 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
网络体系结构及协议的定义
2014/03/13 面试题
物流管理毕业生自荐信
2013/10/24 职场文书
生物科学系大学生的自我评价
2013/12/20 职场文书
自荐信写法介绍
2014/01/25 职场文书
3分钟演讲稿
2014/04/30 职场文书
主题班会演讲稿
2014/05/22 职场文书
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android