简单可记为:
浅拷贝:基本数据类型拷贝的是值;引用数据类型拷贝的是地址
深拷贝:引用数据类型拷贝的是开辟的新地址中的值
如例:
<script type="text/javascript">
var one = {
name : "张三",
age :"20"
}
/*var two = one;
//two 复制的是one存放在堆中的地址,one,two是一个对象的地址,需要新开辟一个地址空间,才能不影响原来的数据
two.name = "two打印的值";
console.log("one",one);*/
// 解决方法(简单版)
var a = JSON.stringify(one);
var b = JSON.parse(a);
//先转成字符串,再转成对象,开辟新的内存空间
b.name = "重新赋值的name";
console.log("one",one);
console.log("b输出的值",b);
/*浅拷贝:基本数据类型拷贝的是值;引用数据类型拷贝的是地址
深拷贝:
引用数据类型拷贝的是开辟的新地址中的值*/
//封装开辟新地址的函数
function deepCopy(obj){
var objs = JSON.stringify(obj);
var newObj = JSON.parse(objs);
return newObj;
}
//数组同样存在深拷贝和浅拷贝
var arr =[10,20,30];
var one =arr;
one.push(123);
//同样会改变原数组
//
//数组的解决方法,只要有返回新数组的均可以解决这个问题
//var one = arr.slice();
//切片
/*var one =deepCopy(arr);
one[0] = "hhh";*/
console.log("arr",arr);
console.log("one",one);
script>
var a = JSON.stringify(one);//先转字符串再转对象
var b = JSON.parse(a);
function deepCopy(obj){
var objs = JSON.stringify(obj);
var newObj = JSON.parse(objs);
return newObj;
}
数组的解决方法,只要有返回新数组的均可以解决这个问题
slice、 concat 、split等
数组的常用方法