
正文
《理解 ES6》阅读整理:函数(Functions)(二)Unnamed Parameters
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
使用未命名参数(Working with Unnamed Parameters)
JavaScript并不限制传递给函数的实参个数,你可以总是传递比形参个数多或者少的实参。在ES6中当向函数传递比形参个数少的实参时,就会使用默认参数值。当向函数传递比形参个数多的实参时,ES6同样有对应的方案使用。来看一个示例:
function pick(object) {
let result = Object.create(null);
for (let i = 1, len = arguments.length; i < len; i++) {
result[arguments[i]] = object[arguments[i]];
}
return result;
}let book = {
title: "JavaScript Guide",
author: "Zakas",
year: 2016
};let bookData = pick(book, "author", "year");console.log(bookData.author); //Zakas
console.log(bookData.year); //
上面这段代码将object的某些属性拷贝出来并返回。我们利用arguments对象来访问多传递的实参。在ES6中你可以用剩余参数来直接访问多传递的参数。
剩余参数(Rest Parameters)
剩余参数以...标记,当你向函数传递多余的实参时,剩余参数会变成一个数组并且包含所有剩余的实参。上面的例子可以用剩余参数重写:
function pick(object, ...keys) {
let result = Object.create(null);
for (let i = 0, len = keys.length; i < len; i++) {
result[keys[i]] = object[keys[i]];
}
return result;
}
在上面的代码中,keys是一个剩余参数并且包含所有在object之后传入的实参。这里可以看到arugments与keys的不同,arugments包含所有的参数。
剩余参数的使用限制(Rest Parameter Restrictions)
剩余参数有两个使用限制。第一个限制是:一个函数中只能有一个剩余参数并且只能放在最后。下面的代码会报错:
function pick(object, ...keys, last) {
let result = Object.create(null);
for (let i = 0, len = keys.length; i < len; i++) {
result[keys[i]] = object[keys[i]];
}
return result;
}
第二个限制是:剩余参数不能使用在对象的setter中。下面的代码会报错:
let object = {
set name(...value) {
//...
}
}
剩余参数对arguments对象的影响(How Rest Parameters Affect the argument Object)
在ES6中,剩余参数对arguments对象的使用实际上没有任何影响,arugments对象包含所有传入函数的参数,而剩余参数包含所有传入函数的多余的参数:
function checkArgs(...args) {
console.log(args.length);
console.log(arguments.length);
console.log(args[0], arguments[0]);
console.log(args[1], arguments[1]);
}ckeckArgs("a,", "b");// 输出
//
//
// a a
// b b






