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

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

研发周报:让开发者高效编程的10个新框架 拯救行将就木的PHP:谷歌为GAE添加PHP支持 PPT集萃(一):10位业内高管分享云计算技术理念与行业趋势 得益于苹果谷歌,未来可穿戴技术市场规模可达500亿美元 雅虎11亿美元押注Tumblr三大因素:用户、社交、内容 Perceptual:英特尔感知计算挑战赛 正式启动 吴义坚:创业去!我用深度神经网络,处理语音识别 浅谈用户体验的“反面模式 可穿戴设备又一站:增强现实眼镜CastAR 数字医疗投资将破纪录 投资人看好这些细分领域 Mayer又下一城:雅虎收购Tumblr推进移动化? 前端开发利器:代码预处理工具Prepros 一个轻量级的JavaScript库:Reactor.js [探讨] 用户体验设计师现在面临怎样的机遇和挑战? PPT集萃(二):淘宝、CloudStack等分享的架构经验与最佳实践 2013中国云计算榜单之二:64家云主机+云存储,错综复杂! 看Java技术基础的eBay如何评价他们的Node.js首次尝鲜 Jolla发布首款Sailfish系统手机 无缝兼容Android应用 NPD:全球智能手机出货量2013年将首次超过功能手机 聚合数据左磊:不走寻常路 做国内最好的数据聚合平台 从程序员到软件商 需要注意些什么? 共享软件海外营销策略与实战(上海站) 直接拿来用!最火的Android开源项目(完结篇) 一步加入云生态系统 参加第五届中国云计算大会的十大理由 传苹果iOS7将深度整合Flickr 用户受益最大 Chrome 27来了:页面加载快5% 可同步数据到Google Drive 微软发布新一代游戏主机Xbox One 搭配全新Kinect 2.0体感系统 Unity游戏引擎向iOS与Android开发者免费 Twitter获“下拉刷新”专利 开发者仍可自由使用 复杂产品的响应式设计【流程篇】 使用Javassist库为Bytecode Instrumentation开发JVM Agent www.alldas.de为什么无法访问了??? 如何检测被覆盖的窗口区域是否发生了变化? 高薪寻找西安的兼职UNIX 程序员 如何制作下拉菜单 请高手指点:好猫为何不工作? 一种设想,20台电脑5根电话线上网,如何达到较快的速度? 对话框程序调试时的问题?!!!! 请介绍几本好用的自学C语言的书籍好吗?? 紧急求救,请高手来看看 .NET和JAVA到底哪个好? 谁来救我?ISequentialStream::write()为何不好使? 定义类型的困惑 大虾们,如何做一个图标选择框!!!(详情见内) ADO编程问题求解!!!!!!!!!!! ****************简单问题,高分求救??????????????????????? 请问怎样在TabStrip中的选项卡中增加图片?谢了 工程如何能建的工整一些? www.alldas.de为什么无法访问了? 关于动态控件的问题 ADO编程问题求解 怎么编程产生1MHz甚至更高频率的周期信号? 紧急求助—有关JMail4.1附件问题 挥泪大送分!!!!! 怎样才能让自己变胖? 做个仅有对话框的应用,但想把它放到托盘, 给ASP爱好者提个建议! 关于SQLserver2000“视图“的两个问题,请教高手! 好久没上网了,送分以庆祝再回csdn!!!!! 做浏览器,如何实现 “后退”,“前进”,这二个功能? 如何使C:盘,D盘的根目录不共享? 用resin时,是否需要jdk,如何配置?分必给! SDI中的某一个子视图里怎样对主窗口的状态栏进行更改?? ◇◆◇ 失恋代表什么? ◇◆◇ 我英语不懂,想考高程.行吗 ◇◆◇ 学生生涯快完了,大家来说说对学生生涯的感受,特别是什么最深刻的! ◇◆◇ 求救!如何把SQL命令从前端应用程序传给应用程序服务器 要去招商行笔试了,有参加过的兄弟给点建议。 ###############讨论一下->微软全力推出.NET技术和C#语言的出现,VC++还有多久的寿命??? 要去招商行笔试了,有参加过的兄弟给点建议 如何发一消息,帮别人问的 高手帮助!!! 要去招商行笔试,有参加过的兄弟给点建议。 要去招商行笔试,有参加过的兄弟给点建议 我配置的IIS,为什么只能读数据库,不能写入?为什么? 我要去招商行笔试了,有参加过的兄弟给点建议。 好久没发帖了……………… 请问LINUX/UNIX下那种扩展名的文件是可执行的?DOS的。EXE对应的格式是什么? C++入门看什么书好? c++一问题 20分呀!!!!!谁有BIG5到GB的好方法!(除了用码表文件) 请介绍一下FREENET中所谓“寻找最近主机”的算法。 已知2+根号3是方程x2-4x+c的一个根,求方程的另一个根及c的值 无论x取何值,多项式(m-1)x的3次方+2mx的2次方+(m+1)x+p都等于px的2次方-qx+p,求(m+p)的p-q的值? 已知x1,x2是方程x^2+px+q=0的两个实数根,且x1^2+x1x2+x2^2=5,求q能取最大值. 已知关于X的一元二次方程x的平方+(m+3)+m+1=0.若X1,X2是原方程的根,且|X1-X2|=二倍根号二.求m的值 当x等于3时,代数式px的3次方+qx+1的值为2002,当x等于-3时,求代数式px的3次方+qx+1的值 (x1,x2,x3)乘行列式a11,a12,a13 a21,a22,a23 a31,a32,a33再乘x1,x2,x3.感激不尽x1,x2,x3是一列的,应该可以叫一阶行列式吧, x1、x2是方程x^+根号p*x+q=0的两个根且x1^+x1x2+x2^=3/2,1/x1^+1/x2^=5/2,求p、q的值 设x1、x2是关于x的方程x²+px+q=0的两根,x1+1、x2+1是关于x的x²+qx+p=0的两根,求p、q的值 行列式计算 形如向量A(a,b.c)或 a 的行列式怎么求?b c 和 a11 a12 a13 a21 a22 a23 的行列式怎么求呢?说白了就是单向量α β 和矩阵(不是方阵) 可以求其行列试吗?怎么求? 方程根号4-x2=lgx的根个数是几个? 已知X²+PX+q=O的两根之差等于方程X²+qX+P=0的两根之差那么除去P²-4q>0与q²-4P>0之外,P与q还应具有关系式 设行列式|a11 a12#a21 a22|=m |a13 a11#a23 a21|=n 则行列式|a11 a12+a13#a21 a22+a23| 等于? 已知X1,X2为方程X的平方加px加q等于0的两根,且X1加X2等于6,X1的平方加X2的平方等于20求p和q的值? 关于x的一元二次方程x²+px+q=0的两根分别为x1=-3 x2=1,求p和q的值? 行列式第一行X1^2-1 X1X2 ...X1Xn 第二行X2X1 X^2-1 ...X2Xn 最后行XnX1 XnX2 ...Xn^2-1的值 ∑Xi^2=1 已知关于X的方程x^2-px+q=0的两根分别为x1,x2,且x1^2+x2^2=7,1/x1+1/x2=3,求p+q的值 如果关于x的一元二次方程x的平方+px+q=0的两根分别为x1=2,x2=1,那么p、q的值分别是A 、3,2 B、3,-2 C、2,-3 D、2,3应该选哪个我想知道过程是如何解 计算行列式,第一行:x,y.y,第二行:y,x...y中间几行省略号,最后一行:y y.x 已知关于x的方程x²-px+q=0两根为x1、x2,则-x²+px-q=0等于多少A、-(x+x1)(x+x2)B、(x+x1)(x-x2)C、-(x-x1)(x-x2)C、(x-x1)(x+x1)选哪一个?最好有过程 已知、x1=2+3i是实系数一元二次方程x²+px+q=0的一个根求实数p,q及另一个跟x2 计算行列式|1+x1^2 x1x2...x1xn,x2x1 1+x2^2...x2xn.xnx1 xnx2...1+xn^2| 已知三角形ABC的一边长为5,另外两边长恰是方程2x^2-12x+m+1=0的两根,求实数m的取值范围已知方程x^2+px+q=0的两个实数根分别比方程x^2+qx+p=0的两实数根小1,求以1/p,1/q为两根的一元二次方程 如果关于x的一元二次方程x2+px+q=0的两根分别为x1=3、x2=1,那么这个一元二次方程是( )A.x2+3x+4=0 B.x2-4x+3=0 C.x2+4x-3=0 D.x2+3x-4=0 数列满足x1=1,x2=2/3,且1/xn-1+1/xn+1=2/xn(n>=2),则xn等于多少 已知关于x的一元二次方程x2+px+q=0的两个实数根为p.q,则p,q=? 已知关于x的方程x²+px+q=0的两个根为x1=3,x2=4,则二次三项式x²-px+q可分解为: 有一列数x1,x2,x3······xn已知x1=1,x2-x1=3,x3-x2=5,···,xn-x n-1=2n-1,当xn+x n-1=181,n的值是 已知方程x^2+px+q=0的两根是a,b.求证:一元二次方程qx^2+p(1+q)x+(1+q)^2=0的根为a+1/b和b+1/a如题. 若二次三项式x²-px+q可以分解为(x-1)(x+2),那么方程x²-px+q=0的两个实数根是 有一列数,第一个位x1=1.第二个为x2=3,从第三个数开始依次为x3、x4、xn,从第二个数有一列数,第一个位x1=1.第二个为x2=3,从第三个数开始依次为x3、x4、xn,从第二个数开始,每个数是相邻两个数的一 设x1,x2是方程x²+px+q=0的两实数,x1+1,x2+1是关于x的方程x²+qx+p=0的两实跟,则p=?q=? 已知关于x的方程x²-px+q的两个根是x₁=1,x₂=-2,则二次三项式x²-px+q请用语言说明为什么 一列数:X1、X2、X3、.、Xn、Xn+1、.,其中X1=3 (1)如果对任意的n,有Xn+1=Xn+2 计算X2=( )一列数:X1、X2、X3、......、Xn、Xn+1、......其中X1=3(1)如果对任意的n,有Xn+1=Xn+2计算X2=( )X3=( )X4=( 若p,q为正实数,且关于x的方程x2+px+q=0与x2+qx+p=0均有实根,求p+q的最小值cdinten 你的答案不对恶,把4代进去就是错的。 若多项式x²+px+q可分解为(x+a)(x+b)则方程x²+px+q=0的根为x1 x2 设X1、X2、X3……Xn是整数,并满足:(1)-1≤Xi≤2 i=1、2、.n;(2)X1+X2+……+Xn=19 (3)X1的平方+X2的平方+……+Xn的平方=99求X1的立方+X2的立方+……Xn的最大值与最小值 方程x的平方+px+q=0的解集是A,方程X的平方+qx+2p=0的解集是B,又AnB={-1},求AUB 已知关于x的方程2x²+px+q=0的两根为x=2,x=-3,则二次三项式2x²+px+q可以因式分解为 已知X1,X2,X3,...Xn中每一个数值只能取-2,0,1中的一个,且满足:X1+X2+X2+...+Xn=-17,X1²+X2²+X3²+...+Xn²=37求X1³+X2³+X3³+...+Xn³的值当X=1+√2002/2时,代数式(4X³-2005X-2001)^2009的 若方程x^2+px+q=0与x^2+qx+p=0有一公共根,且p不等于q,求(p+q)^2009的值答出来还送积分哦~加油.. 已知关于x的方程x^2+px+q=0的两根为x1=3,x2=-4,则二次三项式x^2+px+q可分解为 有一列数X1 X2 X3 .XN XN+1 X1=3 如果对任意的N 有XN+1=2XN 试着 把 XN用N表示出来 一元二次方程px平方+qx平方+r=0(p不等于0)的两根为0和-1,则q:p= 已知关于x的一元二次方程kx²-px-3=0的二根分别为x1,x2,其中(1/x1+1/x2)²=4,求k,q的值 若一组数据X1,X2,X3,X4,…,Xn的方差为0,则表示( )A.X拔=0B.X1=X2=…=Xn=0C.X1=X2=…=XnD.无法确定 已知方程x^2+px+q=0的一个根与方程x^2+qx-p=0的一个根互为相反数,并且p不等于q,求p-q的值. 关于x的一元二次方程x^2-px-p=0有两实数根x1,x2,若x1^2+x2^2=3,则p的取值是 有一列数:X1、X2、X3……XN……其中X1等于31 如果对任意的N,有XN+1=2XN.计算X2=( ),X3=( ),X4=( ),根据上面一小题的结果,请试着把XN用N表示出来:XN=( ),计算X6=( ) 若log2(2-a)/根号(a-1)有意义,则a的取值范围 已知:方程x^2+px+q=0的两个根为a,b,而a+1和b+1是关于x的方程x^2+qx+p=0的两根,求p,q的值. 已知x1x2是关于一元二次方程x的平方-6x+k=0的俩个实数根,且x1的平方x2的平方-x1x2=115(1)求k的值 (2)求x1的平方+x2的平方+8 的值 设关于方程4^x-2^x+1-b=0,若方程有实数解,求实数b的取值范围 以知关于X的方程 X的平方-pX+qX=0 的两个根是2和-3,求p,q的值. 一元二次方程x2+Px+q=0(如果有实数根)两根的和为? 方程根号下(4-x^2)=lgx的根的个数是请把步骤写得清楚点,谢谢 如果x=3时,代数式px的3次方+qx+1的值为2008,则当x等于-3时px的3次方+qx+1 若关于x的一元二次方程x2+px+1=0的一个实数根的倒数恰是它本身,试求p的值 方程根号下4-x^2=lg x的根的个数4-x^2都在根号里 当x=-2时,代数式px的3次方+qx+1的值等于2012,那么当x=2时,代数式px+qx+1的值为多少?错了,当x=-2时,代数式px的3次方+qx+1的值等于2012,那么当x=2时,代数式px的3次方+qx+1的值为多少?四个选项A.2010 B.-201 设x1,x2是方程x^2-x-1=0的两个根,则x1+x2是多少?x1×x2是多少?(韦达定理)抱歉方程打错 X^2-x=2
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn