本文是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!
默认参数细节:
- 默认值表达式在函数调用时自左向右求值,默认表达式可以使用该参数之前已经填充好的其它参数值。
没有默认值的参数隐式默认为 undefined,所以function animalSentenceFancy(animals2="tigers", animals3=(animals2 == "bears") ? "sealions" : "bears") { return `Lions and ${animals2} and ${animals3}! Oh my!`; }
function myFunc(a=42, b) {...}
等效于
-
function myFunc(a=42, b=undefined) {...}
停止使用Arguments
在使用不定参数或默认参数的函数中禁止使用 arguments 对象。曾经实现过 arguments 的引擎不会立即移除对它的支持,当然,现在更推荐使用不定参数和默认参数。
浏览器支持
FireFox15+就已经支持 V引擎也开始支持
Babel和Traceur都支持默认参数
本文参考《ES6-In-Depth》
参考MDN