ES6--不定参数

  <一>,在讨论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');
原文地址:https://www.cnblogs.com/yyy6/p/8296164.html