可以将rest参数用作解构赋值吗?

Can you use a rest parameter as a destructuring assignment?

本文关键字:赋值 rest 参数      更新时间:2023-09-26

例如,这里有一个复制对象的方法:

const o = {
  hello: 'hello',
  world: 'world'
}
const { hello, world } = o;
const o2 = { hello, world };

我想使用rest参数来简化这一点,但这似乎不可能(除非我只是搞砸了语法):

const o2 = { ...Object.keys(o) }

这是不可能的,还是我的语法错了?如果这是不可能的,有没有其他方法来复制一个对象在ES6,除了Object.assign ?

var o2 = {};
Object.assign(o2, o);

我不喜欢Object.assign方法的唯一原因是因为它感觉"变异",比{ ...Object.keys(o) }这样的功能更强的方法更有状态。想法吗?

在ES7中有一个关于对象展开元素的建议,它的工作原理与数组展开操作符非常相似:

var o1 = {foo: 42}:
var o2 = {...o1};
// o2 is now a shallow copy of o1

在提案中可以看到,这实际上只是Object.assign的语法糖,相当于

var o2 = Object.assign({}, o1);

同样的建议还定义了一个对象rest元素,所以这也可以工作:

var {...o2} = o1;

根据您的请求给出答案:

根据MDN的描述,Object.assign()这样做: object. assign()方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象

为什么这不是你想要的复制?听起来它完全满足了普通对象的需求。它的状态不比其他任何东西多或少。它会生成一个副本。


供参考,你可以让你自己成为一个复制函数:

Object.myCopy = function(source) {
    return Object.assign({}, source);
}