JavaScript学习之ES6 ES2015学记笔记(四)-不定参数与默认参数

本文是JavaScript ES6的学习记录 本节主要讲述JavaScript的函数语法

不定参数

       可变参数可接受任意数量的参数,如String.prototype.concat方法就是可以接受任意数量的字符串参数。ES6提供了一种可
变参函数的新方式——不定参数:

      先演示可变参数:例如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;
}

  arguments对象是一个类数组对象。arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:

arguments[0]
arguments[1]
arguments[2]

参数也可以被设置:

arguments[1] = 'new value';

arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。例如,它没有 pop 方法。但是它可以被转换为一个真正的Array

var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);

// ES2015
const args = Array.from(arguments);
const args = [...arguments];

 

         上面例子中参数haystack接受了多个参数,应该从1开始迭代,因为arguments[0] 相当于haystack。如果想在haystack前面添加参数需要更新循环体。不定参数恰好可以解决可读性与参数索引的问题。下面是不定参数特性实现的 containsAll 函数:

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

   ...needles语法。我们来看一下调用 containsAll("banana", "b", "nan")之后的函数调用过程,与之前一样,传递进来的第一个参数"banana"赋值给参数 haystack, needles 前的省略号表明它是一个不定参数,所有传递进来的其它参数都被放到一个数组中,赋值给变量 needles。对于我们的调用示例而言, needles 被赋值为["b", "nan"],后续的函数执行过程一如往常。

        在所有函数参数中,只有最后一个才可以被标记为不定参数。函数被调用时,不定参数前的所有参数都正常填充,任何“额外的”参数都被放进一个数组中并赋值给不定参数。如果没有额外的参数,不定参数就是一个空数组,它永远不会是 undefined

默认参数


        ES6中引入了一种新方式,可以指定任意参数的默认值。JavaScript有严格的默认参数格式,未被传的默认为undefined。

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

默认参数的定义模式为默认参数的定义形式为[param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]],对于每个参数而言,定义默认值时=后的部分是一个表达式,如果调用者没有传递相应参数,将使用该表达式的值作为参数默认值。

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!

默认参数细节:

  • 默认值表达式在函数调用时自左向右求值,默认表达式可以使用该参数之前已经填充好的其它参数值。
    function animalSentenceFancy(animals2="tigers",
    animals3=(animals2 == "bears") ? "sealions" : "bears")
    {
    return `Lions and ${animals2} and ${animals3}! Oh my!`;
    }
    没有默认值的参数隐式默认为 undefined,所以
    function myFunc(a=42, b) {...}

    等效于

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

     

停止使用Arguments

       在使用不定参数或默认参数的函数中禁止使用 arguments 对象。曾经实现过 arguments 的引擎不会立即移除对它的支持,当然,现在更推荐使用不定参数和默认参数。

浏览器支持

FireFox15+就已经支持 V引擎也开始支持

Babel和Traceur都支持默认参数

 

 

本文参考《ES6-In-Depth》

参考MDN

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值