zoukankan      html  css  js  c++  java
  • 《理解 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
  • 相关阅读:
    输入输出、基本运算符、流程控制
    Node学习6-fs模块
    Node学习5-events模块
    Node学习4-Buffer模块
    Node学习3-Path模块
    Node学习2-基础知识/HelloWorld/模块调用/global/process
    Node学习1-基本概念
    gulp/bower/less知识
    AngularJS学习1-基础知识
    JavaScript学习-类/原型链/class
  • 原文地址:https://www.cnblogs.com/xfshen/p/5979919.html
Copyright © 2011-2022 走看看