//深拷贝
var arr1 = [1, 2, 3];
var arr2 = arr1.slice();
arr1.push(4);
console.log(arr2) //[1, 2, 3]
//浅拷贝
var arr1 = [{a:1}];
var arr2 = arr1.slice();
arr1[0].a = 2;
console.log(arr2[0].a) //2
同样的方法,一会是深拷贝一会是浅拷贝,对数组来说,深拷贝和浅拷贝得看数组的格式吗?
//深拷贝
var arr1 = [1, 2, 3];
var arr2 = arr1.slice();
arr1.push(4);
console.log(arr2) //[1, 2, 3]
//浅拷贝
var arr1 = [{a:1}];
var arr2 = arr1.slice();
arr1[0].a = 2;
console.log(arr2[0].a) //2
同样的方法,一会是深拷贝一会是浅拷贝,对数组来说,深拷贝和浅拷贝得看数组的格式吗?
这就要分 基本数据类型和引用数据类型Number String Boolean Null
和Undefined
属于基本数据类型,基本数据类型是按值访问的,直接等号赋值是值复制Object Array Function Data
等 属于引用数据类型,引用数据类型只能操作对象在栈内存中的引用地址,等号赋值是引用赋值
你第一个 截取的是 1 2 3
这三个数字返回数组,因为数字是基本数据类型 所以直接是值复制
第第二个 截取的是 {a:1}
这个对象,对象是引用数据类型,复制的是引用地址,使arr1
和arr2
指向同一引用地址,所以更改arr1
,arr2
也会变化
方法1:
var cloneObj = function (obj) {
var str, newobj = obj.constructor === Array ? [] : {};
if (typeof obj !== 'object') {
return;
} else if (window.JSON) {
str = JSON.stringify(obj), //序列化对象
newobj = JSON.parse(str); //还原
} else {
for (var i in obj) {
newobj[i] = typeof obj[i] === 'object' ? cloneObj(obj[i]) : obj[i];
}
}
return newobj;
};
方法2:
function deepClone(obj){
if(!obj&& typeof obj!== 'object'){
return;
}
var newObj= obj.constructor === Array ? [] : {};
for(var key in obj){
if(obj[key]){
if(obj[key] && typeof obj[key] === 'object'){
newObj[key] = obj[key].constructor === Array ? [] : {};
//递归
newObj[key] = deepClone(obj[key]);
}else{
newObj[key] = obj[key];
}
}
}
return newObj;
}
var arr=[{a:1,b:2},{a:3,b:4}]
var newArr=deepClone(arr)
console.log(arr[0])//{a:1,b:2}
newArr[0].a=123
console.log(arr[0])//{a:1,b:2}
还有一个方法就是简单粗暴法!原理很简单,就是先把对象转成字符串,再把字符串转成对象!
var newArr2=JSON.parse(JSON.stringify(arr));
console.log(arr[0])//{a:1,b:2}
newArr2[0].a=123
console.log(arr[0])//{a:1,b:2}
首先,都是浅拷贝。第一种数据存放基本类型,数组中存放的就是基本类型的值,拷贝的就是基本类型的值,第二种存放的是对象,存放的是对象的地址,拷贝的就是对象的地址。
看一张图吧,你应该就可以明白了。
10 回答11.6k 阅读
2 回答3.2k 阅读✓ 已解决
3 回答2.7k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
3 回答792 阅读✓ 已解决
高级语言都是相通的,浅copy指的是arr1, arr身份不同,但是每个项目引用的对象还是同一个,所以当你push的时候,是放到了arr1的地址空间中,而修改{a:1}时,arr1和 arr2都引用了该对象,所以自然就都修改了。
看个python的例子: