实现深拷贝的几种方法
实现深拷贝的几种方法浅拷贝和深拷贝的区别:浅拷贝 : 只是将数据中所有的数据引用下来,依旧指向同一个存放地址,拷贝之后的数据修改之后,也会影响到原数据的中的对象数据深拷贝: 将数据中所有的数据拷贝下来,对拷贝之后的数据进行修改不会影响到原数据1、使用递归的方式实现深拷贝:function deepClone(obj){let objClone = Array.isArray(obj)?[]:{};
·
实现深拷贝的几种方法
浅拷贝和深拷贝的区别:
浅拷贝 : 只是将数据中所有的数据引用下来,依旧指向同一个存放地址,拷贝之后的数据修改之后,也会影响到原数据的中的对象数据
深拷贝: 将数据中所有的数据拷贝下来,对拷贝之后的数据进行修改不会影响到原数据
1、使用递归的方式实现深拷贝:
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判断obj子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
let a=[1,2,3,4],
b=deepClone(a);
a[0]=2;
console.log(a,b);
2、Json.stringify和Json.parse:
用Json.stringify把对象转换成字符串,再用Json.parse把字符串转换成新的对象。
可以转成Json格式的对象才能使用这种方法,如果对象中包含function或RegExp这些就不能用这种方法了。
var obj = {
a: {
c: 2,
d: [9, 8, 7]
},
b: 4
}
var jsontext = JSON.stringify(obj)
var obj1 =JSON.parse(jsontext)
console.log(obj);
console.log(obj1);
obj.a.d[0] = 666
console.log(obj);
console.log(obj1);
3、函数库lodash的_.cloneDeep方法
var _ = require('lodash')
var obj = {
a: {
c: 2,
d: [9, 8, 7]
},
b: 4
}
var obj1 = _.cloneDeep(obj)
console.log(obj === obj1);//false
4、通过JQuery的extend方法实现深拷贝:
let $ = require('jquery');
let obj1 = {
a: 1,
b: {
f: {
g: 1
}
},
c: [1, 2, 3]
};
let obj2 = $.extend(true, {}, obj1);
更多推荐
已为社区贡献1条内容
所有评论(0)