不定参数和默认参数:

    function containsAll(str) {
for(var i = 1;i < arguments.length;i++) {
var hasStr = arguments[i];
if( str.indexOf(hasStr) == -1 ) {
return false;
}
}
return true;
}
console.log( containsAll("banana","b","nan") );//true
console.log( containsAll("banana","c","nan") );//false

上面例子中使用到了arguments对象,它是一个类数组对象,包含了传递给函数的所有参数。这样的的传参无法看到参数的具体个数,还有参数是从1开始迭代,arguments[0]相当于参数,如果要添加了参数,则必须要重新遍历参数。

es6中的不定参数:

    function containsAll6(str,...needles) {
//alert(needles.length);
for(var needle of needles) {
if(str.indexOf(needle) == -1) {
return false;
}
}
return true;
}
//test...
console.log( containsAll6("banana","b","nan") );// alert() == 2["b","nan"] true

...needles是es6中的信语法,称为不定参数。执行函数后,传进来的第一个参数赋值给str,...neddles不定参所有传递的参数被放到一个数组中,赋值给变量needles。
所有函数中,只有最后一个才可以被标记为不定参数。函数调用时,不定参数前的所有参数正常填充,参数都被放进一个数组中并赋值给不定参数,如果没有额外的参数,不定参数就是个空数组。永远不会是undefined。

默认参数:
通常情况下函数调用者不需要传递是有可能的函数,没有被传递的参数可由感知到的默认参数进行填充。JavaScript有严格的默认参数格式,未被传值的参数默认为undefined。es6引入了一种新的方式,可以指定任意参数的默认值。

    function animalSentence(animals2="tiggers",animals3="bears") {
return `lions and ${animals2} and ${animals3}! oh my!`;
}
console.log(animalSentence());//lions and tiggers and bears! oh my!
console.log(animalSentence("mouse"));//lions and mouse and bears! oh my!
console.log(animalSentence("pig","cat"));//lions and pig and cat! oh my!

默认参数的定义形式:[param1=[defaultValue1],...,paramN=[defaultValueN]],对于每个参数而言,定义默认值时=后面的部分是一个表达式,如果调用者没有传递参数,将使用表达式的值作为默认的参数。
注意细节:
默认值表达式在函数调用是自左向右求值,这也意味着默认表达式可以使用该参数之前已经填充好的其他参数。

    function animalSentencFancy(animals2="tiggers",animals3=(animals2 == "bears")?"sealions":"bears") {
return `lions and ${animals2} and ${animals3}! oh my!`;
}
console.log(animalSentencFancy("bears"));//lions and bears and sealions! oh my! animals3的表达式是一个三元运算
console.log(animalSentencFancy(undefined,"unicorns"));
//lions and tiggers and unicorns! oh my! undefined值等于不传值,没有默认值的参数隐式默认为undefined。
function myFn(a=42,b) {...}//参数是合法的等价与
function myFn(a=42,b=undefined) {...}

最新文章

  1. OpenStack 企业私有云的若干需求(3):多租户和租户间隔离(multi-tenancy and isolation)
  2. OC基本数据存储方式
  3. Android流量统计TrafficStats类
  4. 利用Jquery实现http长连接(LongPoll) {转}
  5. Codeforces Round #368 (Div. 2) C. Pythagorean Triples(数学)
  6. Linux PS 命令详解
  7. web storm使用和配置
  8. AndroidUniversalImageLoader网络图片加载
  9. [HNOI 2001]矩阵乘积
  10. 迷茫&lt;第二篇:回到老家湖南长沙&gt;
  11. Linux下好用的屏幕录像软件kazam及截图软件shutter
  12. 40个Java多线程面试问题
  13. console.time和console.timeEnd用法
  14. @Valid报错 No validator could be found for constraint
  15. 常用工具类系列之DateUtil
  16. 基于数据库构建分布式的ID生成方案
  17. [MongoDB] 安装MongoDB配置Replica Set
  18. [javaSE] 多线程(售票例子)
  19. .net mvc 使用ueditor的开发(官网没有net版本?)
  20. 简单介绍Java的静态分派和动态分派

热门文章

  1. Bayes++ Library入门学习之熟悉class-Bayesian_filter_base(1)
  2. caffe(12) 训练自己的数据
  3. php八大设计模式之观察者模式
  4. 负载均衡集群总结(Haproxy)
  5. [NOIP2014普及组]子矩阵
  6. shell应用之批量添加用户实例
  7. 【 D3.js 入门系列 --- 2.1 】 关于怎样选择,插入,删除元素
  8. openssl之BIO系列之6---BIO的IO操作函数
  9. List和iterator的区别
  10. [Python] Pandas load DataFrames