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

【探秘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,进行前端技术交流。  

CIO必知六件事,至少必须想到的! PPT集萃(四):来自五位中外专家分享的虚拟化和云存储实践 Jolla和Sailfish OS,那些你应该知道的事儿 不仅保值还能升值:过时的苹果电脑创下67.1万美元售价 三十天完成跨平台办公套件Joeffice的开发 jQuery 1.10.0和2.0.1同时发布 软件初创公司招投的九个必备技巧 BYOD浪潮即将来袭 六大年轻杀手重塑企业软件 灵活运用AppFlood:提高APP eCPM的10个技巧 事半功倍:你应该知道的HTML5五大特性 创建API监视器的五大技巧 流量激增15倍+ 乐蜂网桃花节大促背后的技术事 Windows 8和IE 10:如何保障视频播放? 云计算大会讲师秀之13:梁家恩,12年积累,构建永久免费的语音云平台 众望所归:智能手机芯片将为服务器所用 没有学位,他通过以下四步进入Google 谈谈Google Polymer以及Web UI框架的未来 保密入髓:前苹果员工揭示公司是如此善于保守秘密 调查显示:软件开发公司出现“人才荒” 三星拟6月20日在伦敦召开新品发布会 推手机新品Galaxy和ATIV 历届中国云计算大会PPT集萃(五):数据安全隐患解析与应对 搞趣网创始人:做不了阳春白雪 就做下里巴人 CMDN Club 28期:创业公司一定不要浪费资源 浅谈Lean UX:我们到底该怎么设计? 张艺谋今日正式加盟乐视 作品专区落户超级电视 WebKit华丽转身:欧朋浏览器8.0新鲜出炉 分析师称应出售Bing?除非微软倒闭,否则不可能卖Bing Go Mobile沙龙第二期:软硬整合与创客精神 专访西电黄宝林:《基于GPU的并行NMF网络聚类算法》获奖背后故事 友友姚宏宇:用C,C++和Java实现自主研发之后,放开心态迎“高朋” 新技术对传统学科的颠覆:系谱网使用大数据寻亲问祖 到底有没有人知道如何可以在panel中动态的调用frame或者是form呢? 哪里有windowsXP下载? 送我能给的最大分,请教很小的问题,中高手进 聊天请进(thinkingdog) 大家来谈谈 IBM都有些什么认证???什么认证现在比较吃香???谢谢!!! 打印数窗问题求助! 如何使用UrlDownloadtoFile下载文件使用进度条? 如何用在两次用getTime()中得到两个不同的时间。 一个类似于牛角尖的问题(多余的CONST),不能忽视,请各位高手详细说明!!谢谢! 怎样读写注册表,每次都不成功,气死我也~! 各位救命啊,用 TClientDataSet.Load XML 的问题。。。。 娃呀呀,pb8怎么这么难安装?jaguar组建就用了5分钟,regester window又用了10分钟,重启动后,还没完,偶不敢装了,把碟退了出来,大家是不是也这样?//牛虻 请教高手一个ado的问题. 请问一个TWebBrowser的问题 请问:系统崩溃后,找不到BOOT,系统告诉:DOS基本分区为格式化?无法引导启动! 在VB.NET的tabcontrol上放置AxMSFlexGrid控件问题,急 java3D 现在大家是用Oracle 8还是 Oracle 9??? C++问题求助! 请教一个错误的原因. 各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版 SCJP里的那些什么300-020,020是什么意思啊? 请问一个关于document.write()方法的问题。急啊! 初学者,欢迎灌水。 Delphi6的Bug?不兼容? 为什么我用GetProfileString()却总是得不到结果 sos 请教各位大侠一个问题 delphi6中的installShield 请介绍接收端CRC校验传输内容是否正确的方法,资料或代码。谢谢! 各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版? 谁会做软件狗?有钱赚了!!! 为什么我用QuickRep作的报表只能显示一条记录,而且columnHeaderBand上内容也显示不出来 请问在税务局开发数据库的同行么?? 大家好各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版? 谁做过软件狗,马上来拿钱!!! 江苏省的成绩什么时候可以出来啊,我是徐州的 shockwaveflash没有hwnd,怎么办? chechy(chechy) 你在吗? 一个关于用excel做的日报的问题 谁会做软件狗,马上来拿钱!!! 给你下跪了,给你磕头了,给你鞠躬了。很简单的问题。谢谢 那位大哥能告诉我在VC中我要创建类的话应该做哪些工作步骤(要详细的,呵呵) 紧急求救,asp连接mysql问题 在使用twebbrowser的时候,怎样制止网页的自动刷新和跳转? vc编译器错了怎么办???突然死机,然后就不好好干了!!谢谢 ?如何将二进制的 值写如注册表? Delphi紧急求助! 我想问的是,返回的 ResultSet 中的某个字段(int 型),如何放到一个 int[]数组里去。因为 ResultSet 不知道怎样取 size,我又不想用 vector, ResultSet的getArray()方法也是莫名其妙。 c盘格式化后,怎样找到linux系统? 有意思 过来研究一下!!!!insert 的!!!!难道 25 不是 long integer 吗 我的程序debug版,一直调试好好的,我rebuid all 一下就出错了,错误如下:怎么回事? l正午时我们在太阳底下的影子长度比下 午时我们在太阳底下的影子的长度 ( ) A. 要长 B. 不变 C. 要短 D, 把1.5长的竹竿直立在地面,测得竹竿的影子长是1.2米,同时量得一根旗杆的影子是这竹竿影子的6倍还多80厘米求旗杆的长. 肯德基的炸鸡配方全球只有俩人知道?那为什么全球各地的KFC的炸鸡基本是一个味?我没问它是不是垃圾食品,我只想知道,一方面,配方高度保密,另一方面,遍布全球的连锁店却出售同一口味的炸 射线b级检测,焊缝是否要磨平 小明把2.5米的竹竿直立在地上,量得它的影子长度是1.5米.如果同一时间、同一地点量得一根电线的影子长度4.8米.这根电线杆高多少米?用比例解。 在空地上立一根竿子,让竿子被太阳照射,当一天中竿子的最短时,竿子的影子朝什么方向猪头滚从东.南.西.北和东南.西南.东北.西北中选 紫铜管钎焊焊缝能用射线检测吗 为什么西西伯利亚平原多沼泽 一天中,阳光下直立物体影子长短有什么变化?爱你? “春天的花开,秋天的风以及冬天的落日”是哪首歌里的词 根据规范的方法,超声波测砼裂缝的深度最小值是多少?为什么? 看云识天气写了几种云,分别对应什么天气 从一天当中阳光下的物体的影子的变化发现什么 混凝土的碳化深度怎么测定 请问以下几种云 是什么云 代表着什么样的天气状况隔着窗户拍的 效果不太好 有污点. 你的家在——,一天当中阳光下的物体的影子是怎样变化的?5年级《寒假之友》4页 急!早晨。上午。傍晚。中午的影子。 通过观察你发现了什么? 当声波在混凝土内传播穿过裂缝时,在裂缝端点处产生衍射,其衍射角与裂缝深度具有一定的几何关系.BJCS-1型混凝土裂缝测深仪正是依据衍射角与裂缝深度的几何关系,自动计算实现裂缝深度的 表示天气的或云的成语有哪些 二氧化碳气体保护焊能不能焊接压力容器 二氧化碳气体保护焊能不能焊接压力容器我是一名焊工,制造压力容器采用二氧化碳气体保护焊焊接A、B类焊缝成形可以,X光照射也可以,就是厂里没有 A、汶川大地震 B、我国东南地区的超强台风 C、西伯利亚地区大片沼泽的的形成 D、全球范围内的大气污染日益严重 请问上面四个选项中哪一个是由于人类活动对地表形态的破坏而造成的恶 求表示天气的或云的成语 CO2焊为什么不能焊接压力容器 一个太阳,竹竿,竹竿的影子是什么成语 天上云代表什么天气?云的形态各式各样,那每个形状都代表什么天气? 焊接压力容器是手工电弧焊好还是二氧化碳气体保护焊焊接好? 垂直竖立在地面上的竹竿,阳光照射下竹竿影子一样长,太阳与地面夹角是多少度 混凝土裂缝怎么处理 压力容器主体焊缝可以用二氧化碳保护焊吗 阳光下,影子的位置和太阳的位置有什么关系?影子的变化和太阳位置的变化以及时间的变化又有什么关系? 混凝土裂缝的产生混凝土在下列情况下,均能导致其产生裂缝,试解释裂缝产生的原因,并指出主要防止措施.水泥水化热大;水泥安定性不良;大气温度变化较大;碱一骨料反应;混凝土碳化; 在同一时间,同一地方的阳光照射下,物体的影子长度和物体高度成什么比例 kfc的菜单 法国的气候类型 一年中每天正午阳光下同一物体影子的长度有什么变化 关于肯德基华莱士,这些仿肯德基的餐厅,点餐都是在菜单上点的,为什么肯德基这些规范的餐厅,点餐反而要在后面的玻璃上点,菜单上的只有套餐却没有单点的,比如一个汉堡包,而且肯德基的套 法国气候类型 铅笔影子的长度约是?身体影子的长度约是?是在阳光下测量,铅笔就是一般的铅笔,人是156左右高矮的人, 肯德基的全家桶.2014年的新春全家桶有什么(名字)、内容、价格和时间. 法国有什么气候类型?急 一天中铅笔的影子的长度是怎样变化的? 西西伯利亚平原与东欧平原同是平原为什么气候差别如此大 法国的气候具有什么特点? 紧急!谁能提供标准GB/T3274-2007里的(普通轧制精度)数值.普通钢板的厚度偏差范围是多少? 东欧平原和西西伯利亚平原的地理环境区别 秋天的落叶,散文开头,落叶的描写我只要一小段开头,很有意境的那种,不要敷衍, GB/T3274-2007 数值Q235B主要问尺寸标准 东欧平原和西西伯利亚平原哪个大?还有为什么在世界地形图上看东欧平原和西西伯利亚都比亚马孙平原大?最好简洁一点! 谁能写《秋天的落叶》作文(纯属自写,不能和其他重复). 俄罗斯西伯利亚三大暖流自南向北流的原因是?还有两个问题:为啥每3、4月份,三四月份会出现河水泛滥,河流两岸形成大片沼泽地,这是河水不会全部注入北冰洋的原因是?、三条河流下游却没 钢板选N类,A类,B类,C类的原则是什么?GB/T709-2006中的钢材厚度偏差分类. 中西伯利亚平原,西西伯利亚高原为什么要以西伯利亚命名 中午12点时太阳底下人的影子()A最长 B最短 C不变 各位老大,请问GB/T3274与GB/T709都是钢板标准,他们有什么区别? 为什么 肯德基配方 中午12点在太阳底下人的影子是( ).A最长 B最短 C不变 D无法确认 GB 10055-2007这个标准谁有啊? 我想知道肯德基的配方 RT射线检测管道焊缝的防护问题咱是新手,刚来不到一个月.我看这里检测焊缝时候,人在10米外左右,射线头是放在架子上向下对着管子的,这样子不会射到人的么?为什么公司说的时候挺夸张的. 太阳光斜照地面,光线与水平面所成的角为b,长为l的竹竿与地面所成的角为a,当a为多少时,竹竿的影子最长 KFC的热橙汁的配料是什么?为什么我用雀巢的橙汁加方糖却调配不出kfc里的那种味道.橙汁粉放少了,觉得味道不浓,橙汁粉放多,又觉得味道很酸,加了糖或者方糖,又感觉太甜?到底kfc里是怎么配
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn