基本数据类型(Undefined,Null,Boolean,Number和String)
他们的值在内存中占据着固定大小的空间,并被保存在栈内存中。当一个变量向另一个变量复制基本类型的值,会创建这个值的副本,并且我们不能给基本数据类型的值添加属性
var x = 1;
var y = x;
x.name = 'aaa';
console.log(x);//1
console.log(y); //1
console.log(x.name); //undefined
复制数据类型
复杂的数据类型即是引用类型,它的值是对象,保存在堆内存中,引用类型值的变量实际上包含的不是对象本身,而是一个指向该对象的指针。
从一个变量向另一个变量复制引用类型的值,复制的其实是指针地址而已,因此两个变量最终都指向同一个对象
浅拷贝
var obj = {
name:'zhangsan',
age: 22
}
var obj2 = obj;
obj2['c'] = 5;
console.log(obj);
console.log(obj2);
var arr = [1, 2, 3, 4];
var arr2 = arr;
arr2[1] = "aaa";
console.log(arr);
console.log(arr2);
--------------------------------------------------------------------------
深拷贝
数组
arr1=[1,2,3,4,5]
arr2=[]
function deepCopy(arr1, arr2) {
for (var i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
}
deepCopy(arr1,arr2)
arr2[0]= 111
console.log(arr1)
console.log(arr2)
//1.slice()
var arr = ['a', 'b', 'c'];
var arrCopy = arr.slice(0);
arrCopy[0] = 'aaa'
console.log(arr); // ["a", "b", "c"]
console.log(arrCopy); // ["aaa", "b", "c"]
//2.concat()
var arr = ['a', 'b', 'c'];
var arrCopy = arr.concat();
arrCopy[0] = 'test'
console.log(arr); // ["a", "b", "c"]
console.log(arrCopy); // ["test", "b", "c"]
对象
var obj = {
name:'zhangsan',
age: 22
}
var obj2 = new Object;
obj2.name = obj.name;
obj2.age = obj.age
obj.name = 'lisi';
console.log(obj);
console.log(obj2);
var obj = {
name: 'aaa',
age: 22
}
var a = [111,222,333]
function copy(oldObj){
let newObj = {};
if (oldObj instanceof Array){
newObj = [];
};
for (let key in oldObj){
let value = oldObj[key];
if (typeof value === "object" && value !== null){//如果原对象的某个属性是复制数据类型,递归调用copy
newObj[key] = copy(value);
} else{//如果原对象的某个属性是基本数据类型,直接将此属性赋值给新对象的相应属性
newObj[key] = value;
}
};
return newObj;
}
var objCopy = copy(obj)
obj.name = 'bbb';
console.log(obj);
console.log(objCopy);
var b = copy(a)
console.log(b)
// 使用JSON.stringify()和JSON.parse()也可以实现深拷贝。当值为undefined、任意函数、symbol时会被忽略。
var obj = {
a: 1,
b: 2,
fn:function(){
console.log(1)
}
}
let newobj = JSON.parse(JSON.stringify(obj));
newobj.a = 3
console.log(obj)
console.log(newobj)
es6 assign() Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。
var obj = {
a: 1,
b: 2,
c:{
d:1
}
}
var obj2 = Object.assign({},obj)
// obj2.a = 111
obj2.c.d = 111
console.log(obj)
console.log(obj2)
|
|