鸦杀's Blog

剩余参数

2018-08-31

注:以下内容是我在阅读了《深入理解es6》《es6标准入门》《你不知道的JavaScript(下)》后所汇总整理,如有雷同存属笔记。


在函数的命名参数前添加三个点(…)就表明这是一个剩余参数,也称“不定参数”。该参数为一个数组,包含着自它之后传入的所有参数。

剩余参数注意点

  • 函数的length属性统计的是函数命名参数的数量,剩余参数的加入不会影响length属性的值。

    1
    2
    3
    4
    5
    6
    var fn = function(a) {
    }
    fn.length // 1
    var fn = function(a, ...b) {
    }
    fn.length // 1

    默认参数有一个知识点,默认参数之后的参数,是不会记入length长度的。如果函数中同时存在默认参数和剩余参数,也是这样的。

    1
    2
    3
    4
    5
    6
    var fn = function(a, b = 2, ...c) {
    }
    fn.length // 1
    var fn = function(a = 1, b, ...c) {
    }
    fn.length //0
  • 每个函数最多只能声明一个剩余参数,而且一定要放在所有参数的末尾。

    1
    2
    var fn = function(...a,b) {}
    // Uncaught SyntaxError: Rest parameter must be last formal parameter
  • 剩余参数不能用于对象字面量setter之中,因为对象字面量setter的参数有且只能有一个。而在剩余参数的定义中,参数的数量可以无限多。

    1
    2
    3
    4
    5
    6
    7
    var obj = {
    b: 1,
    set a(...v) {this.b = v},
    get a() {return this.b}
    }
    // Uncaught SyntaxError: Setter function argument
    // must not be a rest parameter
剩余参数与arguments

剩余参数的设计初衷是代替arguments。

在es4草案中,arguments被移除并添加了剩余参数的特性,从而可以传入不限数量的参数。但是es4从未被标准化,这个想法被搁置下来,直到重新引入了es6标准,唯一的区别是arguments依然存在。

无论是否使用剩余参数,arguments总是包含所有传入函数的参数。

增强的Function构造函数

es6增强了Function构造器。以便可以支持剩余参数默认参数这两个特性,使其具备了与声明式创建函数相同的能力。

默认参数

1
var add = function('first', 'second=first', 'return first + second')

剩余参数

1
var pickFirst = function('...args', 'return args[0]')

Tags: es6

扫描二维码,分享此文章