JS深浅拷贝
js包括基本数据类型:Null、Undifined、Number、String、Boolean
引用数据类型:Array、Object
基本数据类型保存在栈内存,引用数据类型保存在堆内存。因此,对于引用类型的复制,简单赋值无用,需要拷贝。拷贝存在两种类型:深拷贝与浅拷贝。
1、浅拷贝
浅拷贝只复制了指向某个对象的指针,而不复制对象本身,所以如果父对象的属性是基本数据类型,就没事,如果父对象的属性是引用数据类型,则父对象的值也有可能被修改。
// 浅拷贝函数
function simpleClone(obj) {
let temp = {}
for ( let i in obj ) {
temp[i] = obj[i]
}
return temp
}
var obj = {
a: "hello",
b:{
a: "world",
b: 21
},
c:["Bob", "Tom", "Jenny"],
d:function() {
alert("hello world");
}
}
var obj1 = simpleClone(obj)
obj1.a = "hi"
obj1.b.a = "w"
console.log('obj1=>>>',obj1);
console.log('obj=>>>',obj);
结果为:
2、深拷贝
function deepClone( initalObj, finalObj ) {
var temp = finalObj || {}
for( var i in initalObj ) {
var prop = intalObj[i]
if (prop === temp) {
continue
}
if (typeof prop === 'object') {
temp[i] = (prop.constructor === Array) ? [] : Object.create(prop);
} else {
temp[i] = prop
}
}
return temp
}
var obj = {
a: "hello",
b:{
a: "world",
b: 21
},
c:["Bob", "Tom", "Jenny"],
d:function() {
alert("hello world");
}
}
var obj1 = deepClone(obj);
obj1.a = "hi"
obj1.b.a = "w"
console.log('obj1=>>>',obj1);
console.log('obj=>>>',obj);
打印结果为:
内容有参考:https://www.cnblogs.com/136asdxxl/p/8645750.html