<一>,在讨论ES6的不定参数之前,我们先一起回顾一下ECMAScript5的无名参数。
早先,javascript提供arguments对象检查函数的所有参数,从而不必定义每一个要用的参数。尽管arguments象检查在大多数情况下运行良好,但是实际使用起来却有些笨重。
function pink(o) { let result = Object.create(null); // 从第二个参数开始 for (let i = 1; i < arguments.length; i++){ result[arguments[i]] = o[arguments[i]]; } return result; } let book = { title:"武汉", author:"yyy" }; let books = pink(book,'author','age'); console.log(books); //打印结果 { author: 'yyy', age: undefined }
这个函数要注意的事项:
1. 并不容易发现这个函数可以接受任意数量的参数,当然,可以定义更多的参数;
2. 因为第一个参数为命名参数且已被使用,当要查找需要拷贝的属性名称时,不得不从索引1开始而不是从索引0开始。
<二> ES6不定参数来解决以上缺陷
用法: 在函数的命名参数前面添加三个(...)就表明是一个不定参数,该参数为一个数组,包含着自它之后传入的所有参数,通过这个数组名即可逐一g访问里面的参数。举个例子,使用不定参数重写pink()方法。
function pink(o,...keys) { let result = Object.create(null); for(let i = 0; i < keys.length; i++){ result[keys[i]] = o[keys[i]]; } return result; } let book = { title:"武汉", author:"yyy" }; let books = pink(book,'author','age','name'); console.log(books); // 打印结果 { author: 'yyy', age: undefined, name: undefined }
备注不定参数的使用限制:
1. 每个函数最多只能有一个不定参数而且一定要放在所有参数的末尾。
错误用法
function pink(o,...keys,last) { // 函数体 }
2. 不定参数不能用于对象字面量setter之中。
错误用法
function pink(o,...keys) { // 函数体 set name(...value){ } }
3. 不定参数对argements对象的影响
如果声明函数时定义了不定参数,则在函数被调用时,arguments对象包含了所有传入函数的参数。例如:
function chenkArgs(...args) { console.log(args.length); // 2 console.log(arguments); // { '0': 'a', '1': 'wuhan' } console.log(args[0], arguments[0]); // a a console.log(args[1], arguments[1]); // wuhan wuhan } chenkArgs('a','wuhan');