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

Javascript 您可以使用rest参数作为解构赋值吗?,javascript,ecmascript-6,Javascript,Ecmascript 6,例如,这里有一个复制对象的方法: const o = { hello: 'hello', world: 'world' } const { hello, world } = o; const o2 = { hello, world }; 我想使用rest参数来简化这个过程,但似乎不可能(除非我只是搞乱了语法): 这是不可能的,还是语法有误?如果不可能,除了object.assign,是否还有其他方法可以复制ES6中的对象 var o2 = {}; Object.assign(o2,

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

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

const { hello, world } = o;
const o2 = { hello, world };
我想使用rest参数来简化这个过程,但似乎不可能(除非我只是搞乱了语法):

这是不可能的,还是语法有误?如果不可能,除了
object.assign
,是否还有其他方法可以复制ES6中的对象

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

我不喜欢
Object.assign
方法的唯一原因是,它比
{…Object.keys(o)}
等功能更强的方法感觉“变化”和更有状态。想法?

根据您的要求回答此问题:

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

为什么这不是你想要的复制品?听起来,它正是普通对象所需要的。它和其他任何东西一样,都没有多大或少的状态。它是复制品


仅供参考,您可以将自己设置为复制功能:

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

根据您的请求回答此问题:

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

为什么这不是你想要的复制品?听起来,它正是普通对象所需要的。它和其他任何东西一样,都没有多大或少的状态。它是复制品


仅供参考,您可以将自己设置为复制功能:

Object.myCopy = function(source) {
    return Object.assign({}, source);
}
有一个类似于数组扩展操作符的函数:

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;
有一个类似于数组扩展操作符的函数:

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()方法用于将所有可枚举自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。。为什么这不是你想要的复制品?听起来,它正是普通对象所需要的。它和其他任何东西一样,都没有多大或少的状态。它复制了一份。@jfriend00,你是100%对的。那是我的错误。如果你想把它作为一个答案,我会接受它。根据MDN上的描述,
Object.assign()
这样做:Object.assign()方法用于将所有可枚举自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。。为什么这不是你想要的复制品?听起来,它正是普通对象所需要的。它和其他任何东西一样,都没有多大或少的状态。它复制了一份。@jfriend00,你是100%对的。那是我的错误。如果你想回答这个问题,我会接受的。好的,谢谢。我的错误是,我没有意识到它会返回对象。我认为您首先必须声明一个对象,然后使用
对象对其进行变异。assign
(就地更改),这一点我并不喜欢。@JoshBeam,根据MDN上的示例,这正是正在发生的事情。修改并返回目标对象。具体请参见“合并对象”示例。我猜如果您使用
var copy=Object.assign({},obj)通过内联实例化一个匿名空对象,您在某种程度上隐藏了变异,但
assign
仍在变异该空对象。这就是说,对这一点教条是没有什么好处的,所以你所拥有的可能已经足够好了。@DavidS-而且,
Object.assign()
的工作方式使它更加灵活,因为它可以填充一个新的空对象(如你所示,只需传入
{}
)或者,它可以将属性复制到可能已经具有其他属性(例如合并)的现有对象中。不应该担心“突变”空对象。无论任何复制函数是如何编写的,它都将创建一个新的空对象,然后填充它。这只是给你一个选择,如果你愿意,你可以从你自己的对象开始。好的,谢谢。我的错误是,我没有意识到它会返回对象。我认为您首先必须声明一个对象,然后使用
对象对其进行变异。assign
(就地更改),这一点我并不喜欢。@JoshBeam,根据MDN上的示例,这正是正在发生的事情。修改并返回目标对象。具体请参见“合并对象”示例。我猜如果您使用
var copy=Object.assign({},obj)通过内联实例化一个匿名空对象,您在某种程度上隐藏了变异,但
assign
仍在变异该空对象。这就是说,对这一点教条是没有什么好处的,所以你所拥有的可能已经足够好了。@DavidS-而且,
Object.assign()
的工作方式使它更加灵活,因为它可以填充一个新的空对象(如你所示,只需传入
{}
)或者,它可以将属性复制到可能已经具有其他属性(例如合并)的现有对象中。不应该担心“突变”空对象。无论任何复制函数是如何编写的,它都将创建一个新的空对象,然后填充它。这只是给你一个选择,如果你愿意,你可以从你自己的物体开始。啊,是的,我想这正是我一直在寻找的!埋葬