谷歌搜索“的JavaScript对象克隆”带来一些非常奇怪的结果,其中有些是完全过时的,有些是太复杂了,不是那么容易,因为刚:这是克隆ES6中对象的好方法吗?
let clone = {...original};
这有什么不对的?
谷歌搜索“的JavaScript对象克隆”带来一些非常奇怪的结果,其中有些是完全过时的,有些是太复杂了,不是那么容易,因为刚:这是克隆ES6中对象的好方法吗?
let clone = {...original};
这有什么不对的?
完全可以接受的,甚至moreso现在object spread is stage 3克隆。人们过于复杂的事情。
const clone = {...original}
克隆
const newobj = {...original, prop: newOne}
到不可改变添加其他道具原来并存储为一个新的对象。
使用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 }
但是,这不会让深克隆。到目前为止还没有深入克隆的本地方式。
编辑:由于@Mike“Pomax” Kamermans在评论中提到的,你可以深刻的克隆简单对象使用JSON.parse(JSON.stringify(input))
有一个,提供你的对象是一个真正的对象字面值,纯粹是数据,在这种情况下'JSON.parse(JSON.stringify(input))'是一个适当的深度克隆。但是,当原型,函数或循环引用出现时,该解决方案不再有效。 –
@ Mike'Pomax'Kamermans确实如此。丢失吸气剂和吸附剂的功能是可怕的,但... –
如果您需要通用功能来深入克隆任何对象,请参阅http://stackoverflow.com/a/13333781/560114。 –
您应该只使用...(展开(即没有原型,功能或循环引用。) )在iterables上,在非迭代中或在对象文本中使用传播会引发错误。以前的答案是解决方案。您还可以从多个对象
let obj1 = { firstDay: 'monday' }
let obj2 = { secondDay: 'tuesday' }
let obj3 = { thirdDay: 'thirdDay' }
let clone = Object.assign({},obj1,obj2,obj3)
console.log(clone)
// { firstDay: 'monday',
// secondDay: 'tuesday',
// thirdDay: 'thirdDay' }
,如果你不希望使用json.parse(json.stringify(对象)),你可以创建递归键值副本:
function copy(item){
let result = null;
if(!item) return result;
if(Array.isArray(item)){
result = [];
item.forEach(element=>{
result.push(copy(element));
});
}
else if(item instanceof Object && !(item instanceof Function)){
result = {};
for(let key in item){
if(key){
result[key] = copy(item[key]);
}
}
}
return result || item;
}
但最好的方式是创建一个类,它可以返回它的自我克隆
class MyClass{
data = null;
constructor(values){ this.data = values }
toString(){ console.log("MyClass: "+this.data.toString(;) }
remove(id){ this.data = data.filter(d=>d.id!==id) }
clone(){ return new MyClass(this.data) }
}
您的示例是不正确的JavaScript,顺便说一下。 –
这是不合法的ES6。但如果没有,这不是一个克隆:克隆和原始属性现在都指向相同的东西。例如'original = {a:[1,2,3]}'给你一个克隆,其中'clone.a'实际上是'original.a'。通过'clone'或'original'修改*相同的东西*,所以不,这是不好的=) –
@AlbertoRivera它是* kinda *有效的JavaScript,因为它是[stage 2](https:// github。 com/sebmarkbage/ecmascript-rest-spread)提案,这很可能是未来对JavaScript标准的补充。 – Frxstrem