深层克隆
克隆:
浅层克隆
深层克隆
A是一个对象,B是一个空对象,我想把A的属性全部克隆到B身上,并且让A的属性和B没有任何联系,因为有的属性是引用值,你拷贝是拷的引用,他俩操作还是同一个人。
var obj = {
name : "abc",
age : 123,
card : ["visa","master"],
wife : {
name : "bcd",
son : {
name : "aaa"
}
}
}
var obj1 = {
}
function deepClone(origin,target){
}
我想把obj拷给obj1,看你是原始值还是引用值。
如果是原始值直接拿过来;如果是引用值,再看是数组还是对象,建立新数组,新对象,再看括号里面的是引用值还是原始值,依次循环。
总结:
- 判断是不是原始值;
- 判断是数组还是对象;
- 建立相应的数组或对象;
- 依次循环。
var obj = {
name : "abc",
age : 123,
card : ["visa","master"],
wife : {
name : "bcd",
son : {
name : "aaa"
}
}
}
var obj1 = {
name : obj.name,
age : 123,
card :[obj.card[0],obj.card[1]],
wife : {
name : "abcd",
son : {
name : "aaa"
}
}
}
function deepClone(origin,target){
}
遍历对象for(var pro in obj)(数组也能遍历)
1. 判断是不是原始值;typeof()是obj就是引用值,如果不是,很有可能就是原始值,null除外
2. 判断是数组还是对象;三种方法(instanceof,constructor,toString) ,建议用toString()
3. 建立相应的数组或对象;
4.依次循环.递归
var obj = {
name : "abc",
age : 123,
card : ["visa","master"],
wife : {
name : "bcd",
son : {
name : "aaa"
}
}
}
var obj1 = {
}
function deepClone(origin,target){
var target = target || {},
toStr = Object.prototype.toString,
arrStr = "[object Array]";
for(var pro in origin){
if(origin.hasOwnProperty(pro)){
if(typeof(origin[pro]) == "object"){
if(toStr.call(origin[pro]) == arrStr){
target[pro] = [];
}else{
target[pro] = {};
}
deepClone(origin[pro],target[pro]);
}else{
target[pro] = origin[pro];
}
}
}
}
完善一下:是不是还有null的问题!
var obj = {
name : "abc",
age : 123,
card : ["visa","master"],
wife : {
name : "bcd",
son : {
name : "aaa"
}
}
}
var obj1 = {
}
function deepClone(origin,target){
var target = target || {},
toStr = Object.prototype.toString,
arrStr = "[object Array]";
for(var pro in origin){
if(origin.hasOwnProperty(pro)){
if(origin[pro] != "null" && typeof(origin[pro]) == "object"){
if(toStr.call(origin[pro]) == arrStr){
target[pro] = [];
}else{
target[pro] = {};
}
deepClone(origin[pro],target[pro]);
}else{
target[pro] = origin[pro];
}
}
}
return target;
}