这是克隆ES6中对象的好方法吗?

Dmi*_*eev 132 javascript javascript-objects ecmascript-6

谷歌搜索"javascript克隆对象"带来一些非常奇怪的结果,其中一些是绝望的过时,有些只是太复杂,不是那么容易:

let clone = {...original};
Run Code Online (Sandbox Code Playgroud)

这有什么不对吗?

Mar*_*ust 210

完全可以接受,甚至现在对象传播是第3阶段.人们过于复杂化.

const clone = {...original} 克隆

const newobj = {...original, prop: newOne} 不可避免地将另一个道具添加到原始文件并存储为新对象.

  • 但是,这不仅仅是一个浅层克隆?就像在,属性不是递归克隆的,是吗?因此,original.innerObject === clone.innerObject和更改original.innerObject.property将更改clone.innerObject.property. (18认同)
  • 是的,这是一个浅层克隆.如果你想要深度克隆,你必须使用`JSON.parse(JSON.stringify(input))` (18认同)
  • /!\ JSON.parse(JSON.stringify(输入))弄乱了日期,未定义,......这不是克隆的银弹!请参阅:https://www.maxpou.fr/immutability-js-without-library/ (8认同)
  • 那么 hack JSON.stringify()/JSON.parse() 真的是在 ES6 中深度克隆对象的推荐方法吗?我一直看到它推荐。令人不安。 (3认同)
  • 结果是一个简单的对象,而不是原始对象类的实例(对于 JSON.stringify/parse、Object.assign 和 {...originalObj} 也是如此)。拥有对象的真实克隆的最佳方法我建议实现 clone() 方法,该方法将确保返回正确的实例,如 marcel /sf/answers/3274958221/ 所述 (2认同)
  • @MarkShust`JSON.parse(JSON.stringify(input))`将不起作用,因为如果有`functions`或`infinity`作为值,它将只在其位置分配`null'。只有简单的值是“ literal”而不是“ functions”时,它才有效。 (2认同)

Alb*_*era 59

使用Object.assign.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
Run Code Online (Sandbox Code Playgroud)

但是,这不会成为深刻的克隆.到目前为止还没有深层克隆的原生方式.

编辑:正如评论中提到的@Mike'Pomax'Kamermans,您可以深度克隆简单对象(即没有原型,函数或循环引用) {...obj}

  • 如果您的对象是真正的对象文字,那么就有一个,纯数据,在这种情况下,`JSON.parse(JSON.stringify(input))`是一个正确的深度克隆.然而,当时的原型,功能或循环引用正在发挥作用,该解决方案不再有效. (19认同)

sha*_*kur 6

如果您使用的方法不能很好地处理涉及Date等数据类型的对象,请尝试此操作

进口 _

import * as _ from 'lodash';
Run Code Online (Sandbox Code Playgroud)

深度克隆对象

myObjCopy = _.cloneDeep(myObj);
Run Code Online (Sandbox Code Playgroud)