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

时间:2017-02-08 16:13:41

标签: javascript

有人可以在“Angular简介”示例的下面代码中说出“...”是什么?

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

4 个答案:

答案 0 :(得分:10)

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

... doesn't actually have an official name的特殊用法。与其他用途一致的名称将是“spread argument”(通用术语将是"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)));

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

这是原始数组的副本

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 :(得分:0)

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

使用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()和其他数组高阶函数。

其他使用情况...运算符:

  1. 用作传播算子,与剩余算子相反。

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

  2. ... 运算符用于非常容易地复制数组或对象,并且在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)