说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

【探秘ES6】系列专栏:剩余参数和默认参数

HTML文档下载 WORD文档下载 PDF文档下载
新一代JavaScript标准ES6正式发布。【探秘ES6】系列专栏将一一剖析ES6的诸多新特性,让Web开发者对此有清晰全面的了解。本文为系列的第五篇,带你了解ES6的剩余参数和默认参数。

ES6作为新一代JavaScript标准,正式与广大前端开发者见面。为了让大家对ES6的诸多新特性有更深入的了解,Mozilla Web开发者博客推出了《ES6 In Depth》系列文章。CSDN已获授权,将持续对该系列进行翻译,供大家学习借鉴。本文为该系列的第五篇。

本文讲述的是有关ES6剩余参数(Rest parameters)和默认参数(Defaults parameters)的使用。

剩余参数(Rest parameters)

当需要创建一个可变函数API时,该函数需要实现任意数目参数的输入。例如,String.prototype.concat方法可接受任意数目的字符串参数输入。而在ES6中,可利用剩余参数来转变实现思路。

以下将结合实例说明。containsAll是一个可变函数,用于检测字符串是否包含成分子串。例如,containsAll("banana", "b", "nan")返回true,containsAll("banana", "c", "nan")则返回false。

采用传统写法的代码如下:

function containsAll(haystack) {  for (var i = 1; i < arguments.length; i++) {    var needle = arguments[i];    if (haystack.indexOf(needle) === -1) {      return false;    }  }  return true;}

该方法的核心是利用了参数对象,以数组的方式向函数传入参数。它完全满足需求,但可读性差。其函数参数仅是唯一的haystack,因此很难一眼就看出到底包含了哪些参数。此外,在进行递归运算时,需要注意初始位置的索引号是1而不是0,因为arguments[0]对应的是haystack参数。最后假若需要在haystack的前或后添加别的参数,那么就不得不对循环进行更新。如果换用剩余参数,这些问题皆可一一迎刃而解。

使用剩余参数的代码如下:

function containsAll(haystack, ...needles) {  for (var needle of needles) {    if (haystack.indexOf(needle) === -1) {      return false;    }  }  return true;}

该方法实现了与传统写法一样的功能,区别是使用了特殊的语法...needles。那么对于containsAll("banana", "b", "nan"),其运算过程是怎么样的呢?首先haystack被第一个参数banana填充;位于needles前的符号...表明needles为剩余参数;以后的其它参数会被放入一个数组然后再分配给变量needles,本例中为["b", "nan"];之后的判断过程按常规执行。(注:这里使用了for-of 循环语法)

要提醒一点,只有位于最末的参数可被标记为剩余参数。位于剩余参数之前的参数与普通参数的处理方式是一样的。所有的额外参数都会被放入一个数组然后再分配给剩余参数。如果没有额外参数,剩余参数则为一个空数组;剩余参数不能被赋值为undefined。

默认参数(Default parameters)

很多时候,函数对传入的参数不一定全都进行处理,同时默认参数亦可以替代传入参数来进行使用。JavaScript一直以来在默认参数的处理上都显得比较笨拙;无值参数会被看作undefined。ES6里引入了特殊的默认参数处理方式。

请看下面的例子。

function animalSentence(animals2="tigers", animals3="bears") {    return `Lions and ${animals2} and ${animals3}! Oh my!`;}

对上述函数中每个参数来说,=之后的赋值表达式作用是为参数进行默认取值。因此, animalSentence() 返回“Lions and tigers and bears! Oh my!”,animalSentence("elephants") 返回“Lions and elephants and bears! Oh my!”,animalSentence("elephants", "whales") 返回“Lions and elephants and whales! Oh my!”。

使用默认参数时,有几点需要留意。

  • 不同于Python,默认值表达式在函数调用的时候进行求值。也就是说,默认表达式可以使用已定义的参数值。例如把上述动物例子的函数改为较特别的方式:

function animalSentenceFancy(animals2="tigers",    animals3=(animals2 == "bears") ? "sealions" : "bears"){  return `Lions and ${animals2} and ${animals3}! Oh my!`;}

其结果是:animalSentenceFancy("bears") 返回的是 “Lions and bears and sealions. Oh my!”。

  • 取值undefined的作用等于是没有传入任何东西。因此,animalSentence(undefined, "unicorns") 返回的是 "Lions and tigers and unicorns! Oh my!"
  • 没有显式定义的默认参数等同于undefined,因此:

function myFunc(a=42, b) {...}

等同于

function myFunc(a=42, b=undefined) {...}

小结

ES6对剩余参数和默认参数使得JS函数的声明更具可读性和表达性,不妨动手试试。(译者:伍昆 责编:陈秋歌)

原文链接:ES6 In Depth: Rest parameters and defaults

本译文遵循Creative Commons Attribution Share-Alike License v3.0 

相关阅读:

【探秘ES6】系列专栏:ES6简介

【探秘ES6】系列专栏:迭代器和for-of循环

【探秘ES6】系列专栏:生成器

【探秘ES6】系列专栏:模版字符串

欢迎加入CSDN前端交流群:218126086,进行前端技术交流。  

收藏!斯坦福Andrew Ng教授“机器学习”26篇教程全译 美国云计算价格战爆发 王寒:12岁儿童,该怎样开始iOS开发? 陈昊芝:腾讯!让我说你什么好? Top Paid与Top Grossing定价策略的差异 Android版百度云推送正式发布 为何开发者应推动公司开源? 从AppGratis被下架说起,苹果或将再次付出代价 58同城的“烦恼”——8K月薪安全工程师引发的入侵 软件开发实践的24条军规 思科 IBM 微软等巨头联合开发开源SDN项目OpenDaylight 巾帼不让须眉:2012年度云计算领域Top 10女性 中移动全力推进NFC 5月起乘公交可刷手机 支持Android与iOS,Qt 5.1 Alpha全新亮相 Google Play:劣质Android应用已无藏身之地! 360推出信用网站认证开放平台 联合百家协会围剿钓鱼网站 经验分享:百度测试架构师眼中的百度QA(一) 在线旅行服务行业开放API带来的新机遇 专访:悬疑恐怖游戏Year Walk美术及音效设计师 解密:微软都柏林数据中心的神秘“免费冷却”装置 云计算如何影响数字化营销? 榜单:十位帮我们打理数据的存储大佬 OpenStack Grizzly版发布 Comcast、CERN成为新会员 谷歌携Blink来势汹汹 WebKit将成明日黄花? 星巴克与苹果合作 顾客可免费下载付费App 微信回应信令争议 将启动2.5G网络优化计划 凤凰网CTO吴华鹏离职 先后供职长达10年 外媒:开发者每周编码时间仅19.1小时 AppGratis CEO现身说法:应用被苹果儆杀始末 一个Web设计师眼里的云计算 戴尔高管:服务器业务领先惠普五年时间 cout的问题(20分). 关于vector<string>的问题(40分). 有没有上海双杨的PB高手? 在pb中怎样写自动递加的序列号?? 我的visio 2000一旦启动以后,就会说遇到问题需要关闭 请问一个关于连接SQL SERVER2000的问题 两行数据重名,查询的时候只能显示其中一个,怎么处理? 在vbscript中的"%TEMPLATEDIR%\wvline.gif"的"%..%"是什么意思? 一个非常棘手的问题,求求各位了!是关于字符转换的!求求各位大侠! 找人 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 关于Dll里导出VCL控件的问题。。。高手请进。。。。。。 紧急求救!!! 如何制作浮动面板? 给分的问题! 如何获得 mod_webapp.so 紧急求救 想知道各位WINDOWS下用什么SNIFFER? 对于网络上的第三方控件的看法 简单问题?JTable中的数据如何居中对齐,有没有直接的函数(不用自定义CellRenderer) 有关析构函数 请问一个小问题 关于ADO中ltBatchOptimisticr的FilterGroup的问题 两个星要到多少分才能升到三个星呀 请问有谁知道北京的成人教育大致的情况如何? 是VC编译器不符合ANSI C++,还是?? 我现在在写个程序!是关于证券方面的!可是如下的一个小问题如何解决?? ★★如何让excel的某行的值等于另一行的值乘以一个固定值(急问,在线等待)★★ @@@开学了,散分! 怎样构建一个LDAP服务器和怎样使用 用VFW采集时进行压缩的问题。求解 C# 在DW MX中如何进行层定位? 回复:機會不要錯過! 華強科技有限公司幫你成就軟件工程師的夢想! How to access SMB/CIFS from Sun workstation? 谁来拿分啊。我有一个问题自己解决了,但没有给分的对象。 问一个message Bean的问题,up有分 [EJB]HelloWorldBean正确编译配置和执行,但"HelloWorld"却不见了 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 如何让主界面变成三维的那种 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 用什么组件能得到网站上的末知大小的文件? 问一个简单的问题 还是有问题关于获得选中安钮的当前行,请进>> 请教简单问题,如何将菜单的一个选项隐藏。就是类似cb的将Visible=false的做法!! 连接ACCESS数据库的问题? 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 如何提取一个EXE文件的特征码??要高分者和高手进!!!!来者有分! j2ee配置问题,大家帮我看看,错误出在哪里?谢了! 如何在注册表中修改使得浏览的网页可以即时通过工具栏的“编辑”调用DW修改? "聊聊"网站是怎样建的?用拉什么技术,可以即使聊天? 一个圆锥体积是12.56cm立方,比等底等高的圆柱体积少()立方cm 人生寓言白兔和月亮第四段的仍然好在什么地方 在一个圆柱形水桶里,把一段半径是3cm的圆柱形钢材全部垂直放入水中,水面上升10cm,把它竖直拉出来6cm,水面又下降了7cm,求这段钢材的体积? 甲乙两人在一条东西方向的公路方向的公路上行走,甲,在乙西300米甲向东走,乙向西走,2分钟后相遇.两人都向东走,半个小时甲追上乙,求两人的速度 一个圆柱体积18立方cm,高是10cm,把这个圆柱削成一个最大的圆锥体,削去部分体积是()写算式,写清楚,要写得数. 北方和南方农耕文化的相同点和不同点? 动物都要经历哪四个阶段 小轿车上五人.大客车上的人数比小轿车多26人.问两辆汽车上一共有多少人? 电源电压为10V,电压表示数为4V,则灯L1.L2两端的电压各为多少? AB两点,甲乙两人相向而行.甲比乙的速度快.甲距离B点240米时与乙相遇.甲乙继续行走到达终点时原路返回.甲距离A点120米时再次与乙相遇.AB两点距离是多少? 去年小麦种植面积为"1",今年种植面积比去年增加20%.今年种植面积是去年的?% 英语翻译“一个人的生活,过一个人的生日.”翻译成英文怎么说? 甲乙两人步行的速度比是9:7,若甲乙分别由AB两地沿同一公路同向而行,则甲追上乙需4时,若相向而行,则多少时间相遇? 小汽车每辆能坐4人,大客车能坐25人,有3辆小汽车和1辆大客车,问一共能坐多少人?求这道题的答案 围绕克隆技术真神奇来写一段话 ___mol的CO2中含有3g碳 刘庄村今年小麦播种面积比去年增加了10%.今年播种小麦39.6公顷,去年播种多少公顷? 克隆技术奇妙在:第一第二第三要短 如图,已知等腰三角形ABC的底边BC=10cm,顶角为120°,求它的外接圆的直径 一辆轿车可坐4人,一辆客车再多坐2人就是小轿车的10倍.一辆大客车可乘坐多少人 克隆技术神奇在哪 几摩尔的二氧化碳中含有三克碳 今年小麦播种面积比去年增加了5/12,是把【】看作单位1,关系式为【】 克隆技术多么奇妙啊!假如我会克隆,我会怎样? 等腰△ABC的底边BC的长为a,顶角为120°,求它的外接圆的直径 今年小麦的播种面积是去年播种面积的13/12,这里是把谁看作单位1? 某工程基础平面图和剖面示意图如下,计算人工挖地槽长度及土方工程量.(工作面c=300mm;放坡系数K=0.3;1 已知等腰三角形ABC的底边BC=10cm,顶角为120°,求它的外接圆的直径 爱在细微处作文【600】字 我是新手,没多少积分, 如何提高英语学科教学成绩 等腰三角形ABC的顶角∠A=120° BC=12 求它的外接圆的直径w 东北平原比南方种植水稻有利的气候条件 50亿0402万约等于几万? 在等腰三角形ABC中,∠BC=120度,点P是底边AC上一个动点,M,N分别是AB,AC上上的中点,若PM+PN的最小值为2,则三角形ABC的周长是多少? 中南半岛种植水稻的有利条件(地形气候方面) 50亿年等于多少秒 排水管道,检查井有支管接入,上下游管道有跌水,支管该怎么接?支管与上下游管道的管底标高差有什么要求支管的埋深是不是不能低于与下游管道采取管顶平接时的埋深?如果这样,跌水水头大 白兔和月亮 读后感 600字今天就要 已知等腰三角形ABC内接于半径为5的圆O,如果底边BC长为6,则底角的正切值为 检查井管内底标高为什么标在圆圈中间?每个检查井都会画一个十字,然后标高就从十字的中心指出,就算没有画十字的检查井标高也都标在圆圈的最中心位置,这是为什么呢?为什么一定要标在 抄一份材料,每分钟抄30字,若干分钟抄完,当抄写2/5时,决定提高效率50%,结果提前20分钟抄完,这有多少抄一份材料,每分钟抄30字,若干分钟抄完,当抄写2/5时,决定提高效率50%,结果提前20分钟抄完, 小学第一节体育课怎么上? 为什么1+3会等于4 抄写一篇文章,每分钟可抄30个字,当抄了2/5的时候,抄写速度提高到每分钟45个字,结果提前20分钟抄完,求这篇文章的字数.(要用一元一次方程解)! 如何上好小学体育课 有一个高24厘米,底面半径为10厘米的圆柱形容器,里面装了一半水,先有一根长30厘米,底面半径为2厘米的圆柱体木棒,将木棒竖直放入容器中,使木棒底面与容器底面接触,这时水面升高(D)厘米. 抄写一份材料,如每分抄30个字,则若干小时可抄完,当抄完2/5的时候,决定将效率提高40%,结果提前半%抄写一份材料,如每分抄30个字,则若干小时可抄完,当抄完2/5的时候,决定将效率提高40%,结果提 请问谁知道小学体育课教学计划哪儿有 北方是___农业~南方是___农业 抄写一份材料,如每分抄30个字,则若干小时可抄我那,当抄完2/5的时候,决定将效率提高40%,结果提前半小时抄完,问这份材料共有多少字?请用一元一次方程解 RNA是否只分为tRNA,mRNA,rRNA?那么作为RNA病毒的遗传物质RNA有属于哪类呢? 南方以水田农业为主,北方以旱地农业为主,西北发展畜牧业,形成这种生产活动地域差异的主要因素是降水为什么是降水,而不是热量 或者是土壤呢? 抄写一份材料,若每分钟抄写30个字,则用若干小时可抄完.当抄完2/5时,决定将效抄写一份材料,若每分钟抄写30个字,则正好在计划时间内抄完。当抄完2/5时,决定将效率提高40%,结果比原计 1.2亿等于几万 有甲 乙两个大小不同的圆柱形容器 甲容器的底面半径的24厘米 乙容器的底面半径是12CM 已知30厘米深的水乙容器无水 现将甲容器的一部分谁倒入乙容器 使两个容器中的水面高度相等,此时水 灯泡L1和L2串联在电路中,加在它们两端的总电压为12V,L1的电阻是8Ω,L1两端的电压是4V,求L1中的电流.【图】(自己画)已知:求: 月球车玉兔是什么 有一个高为24厘米,内底面半径为4厘米的圆柱形容器,里面装了一半的水,把一跟长L厘米,底面半径为2厘米的圆柱玻璃b棒,竖直放入容器中,使棒的地面与容积底面接触,根据L分别求出水面升高了 甲和乙分别从a b同时相向而行,甲每分走100米,乙每分120米,甲与乙相遇后又走了9分钟才到b地.求a到b的距离 11亿日元相当于多少人民币?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘