《理解 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); //2016
上面这段代码将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"); // 输出 // 2 // 2 // a a // b b