JS对象的深浅拷贝
2018-01-11 10:54
399 查看
深浅拷贝是针对不同类型的数据进行对应的操作。存储在栈中的数据,如String,Boolean,Number等类型数据使用浅拷贝即可,像object,array这种存储在堆中的数据,使用浅拷贝仅仅拷贝的是存储在栈中的地址名,并没有在堆中开辟新的内存,指向的还是同一个对象。
//浅拷贝适用于非引用类型的(字符数值等)拷贝 var obj1={ age:15, boo:true, arr:["小明","韩梅梅"] } var obj2=copy(obj1); obj2.boo=false obj2.arr[0]="李雷" console.log(obj2) // age:15, boo:false,arr["李雷","韩梅梅"] console.log(obj1) //age:15, boo:true,arr["李雷","韩梅梅"] function copy(obj){ var str={}; for (var attr in obj){ str[attr]=obj[attr] } return str }
//深拷贝是对引用类型的拷贝,下面是对对象进行深拷贝 var obj1={ people:{proper:{age:16,sex:"girl"}} } var obj2=deepcopy(obj1); obj2.people.proper.age=23; console.log(obj1.people.proper.age) //16 console.log(obj1.people.proper.age) //23 function deepcopy(obj){ var result={}; for (var attr in obj){ 4000 if(typeof obj[attr] == "object"){ //判断是不是object result[attr]=deepcopy(obj[attr]) }else{ result[attr]=obj[attr] } } return str }
jQuery方式: jQuery.extend第一个参数可以是布尔值,用来设置是否深度拷贝: var obj1={ age:15, boo:true, arr:["小明","韩梅梅"] } var obj3=$.extend(true,{},obj1) obj3.arr[0]="李雷"