xfshen

导航

《理解 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

 

posted on 2016-10-20 12:13  xfshen  阅读(368)  评论(0编辑  收藏  举报