“foo(...arg)”(函数调用中的三个点)是啥意思?

Posted

技术标签:

【中文标题】“foo(...arg)”(函数调用中的三个点)是啥意思?【英文标题】:What is the meaning of "foo(...arg)" (three dots in a function call)?“foo(...arg)”(函数调用中的三个点)是什么意思? 【发布时间】:2017-06-26 08:53:53 【问题描述】:

有人能说出“Intro to Angular”示例中以下代码中的“...”是什么吗?

getHeroes() 
    this.backend.getAll(Hero).then( (heroes: Hero[]) => 
      this.logger.log(`Fetched $heroes.length heroes.`);
      this.heroes.push(...heroes); // fill cache
    );

【问题讨论】:

developer.mozilla.org/nl/docs/Web/javascript/Reference/… 【参考方案1】:

根据问题的标题,在函数声明(括号内)中使用 ...rest operatorrest参数,为了帮助我们创建更灵活的函数,ES6引入了函数参数的rest参数。

使用其余参数,您可以创建带有可变数量参数的函数。这些参数存储在一个数组中,以后可以从函数内部访问。

示例:1

function foo(...args) 
  return "You have passed " + args.length + " arguments.";


console.log(foo(0, 1, 2,4)); // You have passed 4 arguments.
console.log(foo("hello", null, [1, 2],  )); // You have passed 4 arguments.

示例 2:

function foo(...args)
     args.forEach(function(arg)
        console.log(arg);
     )
   

   foo(2,3,4,5,6);

rest 参数消除了检查args 数组的需要,并允许我们在参数数组上应用map()、filter()、reduce() 和其他数组高阶函数。

...运算符的其他用例:

    用作spread operator,与rest operator相反。

    const arr = [6, 89, 3, 45]; const maximum= Math.max(...arr); console.log(maximum);

    ... 运算符用于非常轻松地复制数组或对象,并且分别在 javascript 框架和库(如 angular 和 react)中非常有用。

    const arr1 = [1,2,3,4];
    const arr2 = [...arr1];
    console.log(arr2);//  [1,2,3,4];
    
    const obj1 = 
      name:'john',
      age:25
    
    
    const obj2 = ...obj1;
    console.log(obj2); // Now obj2 is new object and is copy of obj1 (non-mutated 
    way)
    

【讨论】:

【参考方案2】:

它是原始数组的副本

let args = [7, 3, 8];
var [h] = args.reverse(); // args is now 8, 3, 7

var [h] = [...args].reverse(); // args is still 7, 3, 8

也可以用来指定数组的剩余值

var [first, ...rest] = args; // first = 7, rest = [3, 8]

【讨论】:

【参考方案3】:

这是一个名为 Rest Parameters 的 JavaScript 功能。 通过使用它,您的函数可以接受任意数量的参数。 您将三个点放在参数之前(没有空格字符),该机制会为您展开它,就好像它是几个参数的列表一样。 在 Eloquent Javascript 中你有一个很好的例子。

let numbers = [5, 1, 7];
console.log(max(...numbers));
// -> 7

【讨论】:

【参考方案4】:

这与 jQuery 或 Angular 无关。这是 ES2015 中引入的功能。

...doesn't actually have an official name 的这种特殊用法。与其他用途一致的名称将是“传播参数”(通用术语是"spread syntax")。它“爆炸”(传播)一个 iterable 并将每个值作为参数传递给函数。您的示例相当于:

this.heroes.push.apply(this.heroes, Array.from(heroes));

除了更简洁之外,... 的另一个优点是它可以更容易地与其他具体参数一起使用:

func(first, second, ...theRest);

// as opposed to the following or something similar:
 func.apply(null, [first, second].concat(Array.from(heroes)));

【讨论】:

以上是关于“foo(...arg)”(函数调用中的三个点)是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置接收器

计算结果为零且可用作语句的函数宏

go语言三个点的用法

函数定义中的“...args”(三个点)是啥意思?

python多线程之创建线程

call和apply的区别