你可以使用rest参数作为解构赋值吗?

时间:2015-09-16 23:14:13

标签: javascript ecmascript-6

例如,这是复制对象的方法:

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

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

我想使用rest参数来简化此操作,但似乎不太可能(除非我只是弄乱了语法):

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

这是不可能的,还是我的语法错了?如果不可能,除了Object.assign之外,还有另一种方法可以复制ES6中的对象吗?

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

我唯一不喜欢Object.assign方法的原因是因为它感觉到了#34; mutaty"比{ ...Object.keys(o) }这样更具功能性的方法更有状态。想法?

2 个答案:

答案 0 :(得分:3)

有一个ES7 proposal for an object spread element,它几​​乎像数组扩展运算符一样工作:

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

正如您在提案中所看到的,这实际上只是Object.assign的语法糖,相当于

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

同样的提议还定义了一个对象休息元素,所以这也可以起作用:

var {...o2} = o1;

答案 1 :(得分:2)

根据您的要求提供答案:

根据description at MDNObject.assign()执行此操作: Object.assign()方法用于将所有可枚举的自有属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

为什么这不是您想制作副本的?听起来它确实完全是普通对象所需要的。它没有比其他任何东西更多或更少的状态。它制作副本。

仅供参考,你可以让自己成为一个复制功能:

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