irpas技术客

实现对象深拷贝的五种方法_杰尼龟116_对象深拷贝

irpas 4021

对象深拷贝的五种方法 1.json暴力转化

通过JSON.stringify() 和 JSON.parse() 将对象转为字符串之后在转为对象。

var obj = {name:'123'} var obj2 = JSON.parse(JSON.stringify(obj

这种简单粗暴的方式有局限性,当值为undefined、function、symbol会在转换过程中被忽略。

2 es6解构赋 var obj = {name:'123',age:13}; var obj2 = {...obj}

只能深度拷贝对象的第一层,如果对象中的属性也是对象的话,没有办法进行深度拷贝的。

3 for in 循环遍历对象 var obj = { name: "小明", age: 20 } var obj1 = {} for (var key in obj) { //遍历属性值,深拷贝 obj1[key] = obj[key] } console.log(obj1);

同样的,只能深度拷贝对象的第一层,如果对象中的属性也是对象的话,没有办法进行深度拷贝的。

4 Object.assign() 对象的合并

利用Object.assign(), 第一个参数必须是空对象**

var obj = {name:'123',age:13}; var obj2 = Object.assign({},obj1);

只能深度拷贝对象的第一层,如果对象中的属性也是对象的话,没有办法进行深度拷贝的。

5 利用循环和递归的方式 function deepClone(obj, newObj) { var newObj = newObj || {}; for (let key in obj) { if (typeof obj[key] == 'object') { newObj[key] = (obj[key].constructor === Array) ? [] : {} deepClone(obj[key], newObj[key]); } else { newObj[key] = obj[key] } } return newObj; }

在循环递归中需要注意设置临界值(typeof obj[key] == ‘object’),否则会造成死循环。 循环递归可以处理对象中嵌套数组或对象的问题。相当于第三种方法的优化。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #对象深拷贝 # #jsonparse #将对象转为字符串之后在转为对象 #var #obj