为什么展开运算符将对象参数转换为一项数组?

Nic*_*.Xu 3 javascript

"use strict";
let obj1 = { foo: 'bar', x: 42 };
function abc(...aaa) {
    console.log(aaa);
}
abc(obj1)
// log result: [{foo: 'bar', x: 42}]
Run Code Online (Sandbox Code Playgroud)

"use strict";
let obj1 = { foo: 'bar', x: 42 };
function abc(...aaa) {
    console.log(aaa);
}
abc(obj1)
// log result: [{foo: 'bar', x: 42}]
Run Code Online (Sandbox Code Playgroud)

所以在上面的代码中,obj1是一个对象。所以我在函数定义中使用了spread运算符,并在调用函数时给它一个对象。为什么结果是一个包含该输入对象的一项的数组?这里的语法是什么?我在MDN 中没有找到关于 spread operator 的任何解释。请帮我解释一下。

Cer*_*nce 11

这不是传播。这些是rest parameters,它们收集传递到单个数组中的所有剩余参数。

这里有一个参数,因此使用 rest 创建一个只包含该参数(恰好是一个对象)的数组。

以下是一些其他示例,可能会更清楚:

function abc(...aaa) {
    console.log(aaa);
}
abc(5, 5, 5, 5, 5)
abc(3, 1, 2, 5)
abc(1, 2, 3)
abc(0)
Run Code Online (Sandbox Code Playgroud)

它只会以单个数组的形式记录所有传递的参数。