阅读更多
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
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • extjs4 学习笔记源码

    exjts4 学习笔记源码,源码包含windws,hbox,vbox和Grid的应用,其中grid介绍比较多。下载解压后,部署后就可以使用,所有代码均在demo文件夹下。更多extjs4教程,请关注http://www.mhzg.net

  • 测试

    测试是一组活动,是保证产品满足用户对系统性和可靠性需求 测试方法: 静态 VS 动态 开发 VS 独立 黑盒(行为) VS   白盒(结构) VS  灰盒 自动 VS 手动 测试级别 单元测试---&amp;gt; 集成测试 ----&amp;gt;  系统测试 ----&amp;gt; 验收测试 单元测试 优点:通过单元测试了解功能;学习如何使用功能;对重构和bug友好;分模块测试 ...

  • 深圳软件测试学习:如何进行单元测试?

    深圳软件测试学习:如何进行单元测试? 单元测试是针对软件设计的最小单位——程序模块,进行正确性检验的测试工作。其目的在于发现每个程序模块内部可能存在的差错。 在代码编写完成后的单元测试工作主要分为两个步骤人工静态检查和动态执行跟踪。 1)人工静态检查是测试的第一步,这个阶段工作主要是保证代码算法的逻辑正确性(尽量通过人工检查发现代码的逻辑错误)、清晰性、规范性、一致性、算法高效性。并尽可能的发现程...

  • 测试用例设计方法_正交实验法(游戏向)

    一、正交实验法简介    1.1 什么是正交实验法?   正交试验法是研究多因素、多水平组合的一种试验法,它是利用正交表来对试验进行设计,通过少数的试验替代全面试验,根据正交表的正交性从全面试验中挑选适量的、有代表性的点进行试验,这些有代表性的点具备了“均匀分散,整齐可比”的特点。“均匀分散”性使试验点均衡地分布在试验范围内,让每个试验点有充分的代表性;“整齐可比”性使试验结果的分析十分方便,可以估计各因素对指标的影响,找出影响事物变化的主要因素。实践证明,正交试验法是一种解决多因素问题卓有成效的方法。

  • ExtJs源码分析与学习—ExtJs核心代码(一)

    NULL 博文链接:https://linder0209.iteye.com/blog/865372

  • ExtJS4.1学习心得及源码

    ExtJS4.1学习心得及源码 目录 一、安装与配置 二、第一个ExtJS例子 三、表格 四、从XML读取数据表格 五、按钮 六、ComboBox控件 七、Panel面板 八、Viewport 九、表单Form 十、窗口 十一、消息对话框 十二...

  • ExtJs源码

    extjs 源码,有兴趣的可以学习下

  • ExtJs源码分析与学习—ExtJs核心代码(三)

    NULL 博文链接:https://linder0209.iteye.com/blog/882451

  • ExtJS6.5-Modern实例源码

    顺序来阅读和学习本书。 有一定 JavaScrt、 Css、 Html 编程经验的读者, 可以略过一些 章节, 直接阅读自己感兴趣的内容。 你不一定能读懂所有的代码, 但是你可以去读懂每行代码, 细心一点, 仔细一点。 用计算机...

  • ExtJS源码分析与开发实例宝典完整版

    ExtJS源码分析与开发实例宝典完整版 1、JS画图部分代码在IE8上看不到效果,因为IE8不支持VML。 2、扩展的组件为作者独立完成,仅供学习之用,一些组件并没有经过严格的测试。 如果需要用到项目之中,请自行测试。 ...

  • Extjs布局源码

    想学Extjs吗 这是一个学习Extjs复杂布局的源码 很不错哦!

  • ExtJs源码分析与学习—ExtJs源码结构

    一、源码的目录结构 以下是以官方最新版本ext-3.3.1列出源码目录结构 1、 adapter :适配器,主要是ExtJs 提供了4中适配器 ext、jquery、prototype、yui。通过这些适配器,可以使ExtJs的应用建立在这些...

  • Extjs学习

    NULL 博文链接:https://jiajiafucs.iteye.com/blog/1738214

  • ExtJS源码分析与开发实例宝典(1)——1

    ext 学习资料 内部学习使用。

  • ExtJs 示例项目 源码加数据库

    一个完整的ExtJs 项目 ,写的详细,数据库齐全。 因为公司要用ExtJs 本人也是那他作为自己的学习例子。项目也是从网上找的,数据库是自己后写的。错误代码基本调试完毕。用的MySql数据库,改一下配置文件即可运行。

  • extjs3和4 学习文档chm 分享

    NULL 博文链接:https://786395613.iteye.com/blog/2214701

  • extJS学习记录

    NULL 博文链接:https://charice59.iteye.com/blog/1744384

  • ExtJS 学习专题(一) 如何应用ExtJS(附实例)

    要使用ExtJS,先要得到ExtJS库... build: 压缩后的ext全部源码(里面分类存放)。 docs: API帮助文档。 exmaples:提供使用ExtJs技术做出的小实例。 resources:Ext UI资源文件目录,如CSS、图片文件都存放在这

  • ExtJS5学习之Hello World

    NULL 博文链接:https://iamyida.iteye.com/blog/2180861

  • Extjs学习资料

    NULL 博文链接:https://airen2008.iteye.com/blog/257541

Global site tag (gtag.js) - Google Analytics