【问题标题】:Can you use a rest parameter as a destructuring assignment?您可以使用休息参数作为解构赋值吗?
【发布时间】:2015-09-17 13:24:33
【问题描述】:

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

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 方法的唯一原因是因为它感觉“变异”并且比{ ...Object.keys(o) } 等功能更强大的方法更有状态。想法?

【问题讨论】:

  • 根据 MDN 的描述,Object.assign() 这样做:Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标目的。它将返回目标对象。。为什么这不是你想要的复制品?听起来它完全符合普通对象的要求。它没有比其他任何东西或多或少的状态。它会复制一份。
  • @jfriend00,你是 100% 正确的。这是我的一个错误。如果您想将其作为答案,我会接受。

标签: javascript ecmascript-6


【解决方案1】:

有一个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;

【讨论】:

  • 啊,是的,我想这正是我一直在寻找的!有趣的东西。
【解决方案2】:

根据您的要求进行回答:

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

为什么这不是你想要的复制品?听起来它完全符合普通对象的要求。它没有比其他任何东西或多或少的状态。它会制作副本。


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

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

【讨论】:

  • 好的,谢谢。我的错误是我没有意识到它会返回对象。我以为你必须先声明一个对象,然后用 Object.assign 改变它(就地更改它),我不喜欢。
  • @JoshBeam,根据 MDN 上的示例,这正是正在发生的事情。目标对象被修改并返回。具体参见“合并对象”示例。我猜如果您使用var copy = Object.assign({}, obj);,您已经通过内联实例化匿名空对象来隐藏突变,但assign 仍在突变该空对象。也就是说,教条主义并没有什么好处,所以你所拥有的可能就足够了。
  • @DavidS - 而且,Object.assign() 的工作方式使其更加灵活,因为它可以填充一个新的空对象(只需传入 {},如您所示)或者它可以将属性复制到可能已经具有其他属性的现有对象中(例如合并)。不应该担心“变异”一个空对象。不管怎么写任何复制函数,它都会创建一个新的空对象,然后把它填满。如果需要,这只是让您可以选择从自己的对象开始。
猜你喜欢
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
相关资源
最近更新 更多