js对象深浅克隆及封装

对象深浅克隆

1.浅克隆

var obj1 = { a : 10};
var obj2 = obj1;
// 因为obj1 和 obj2 共用一个地址,回到数据修改的时候彼此出现影响;
obj1.a = 20;
console.log(obj2);//20

2.深克隆

var obj1 = { a : 10 };
var obj2 = {};
// 克隆 你有什么我有什么;
// 先去找到原对象里面每一个项数据;
for(var attr in obj1){
        // 给克隆对象赋值每一个数据;
        obj2[attr] =  obj1[attr]
}
obj1.a = 30;
console.log(obj2);//10

3.复杂对象克隆

var obj1 = {
                  a : {},
                  b : {
                        c : {
                              d : 10
                        }
                  }
            }
var obj2 = {};
for(var attr in obj1){
        // 给克隆对象赋值每一个数据;
        obj2[attr] =  obj1[attr]
}
console.log(obj1.a === obj2.a);//true

// var obj1 = {
//         a : {},
//         b : {
//             c : {
//                     d : 10
//             }
//         },
//         c : []   //也可以时数组格式
// }

4.深克隆的递归封装

function cloneObj( obj , type){
    type = type || "object";
    var clone = (type === "object" ?  {} : []) ;
    for(var attr in obj){
        // 判断数组项是不是对象;
        // 1. typeof 对象 必须是 object;
        // 2. instanceof 不能是 Array;
        if( typeof obj[attr] === "object"  && !(obj[attr] instanceof Array) ){
                // 这是对象类型;
                clone[attr] = cloneObj( obj[attr] );
        }else if( typeof obj[attr] === "object"  && (obj[attr] instanceof Array)  ){
                // 这是数组类型;
                clone[attr] = cloneObj( obj[attr] , "array" );
        }else{
                // 这是基本类型;
                clone[attr] = obj[attr];
        }
    }
    return clone;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
拷贝: 1. 使用 Object.assign(target, source) 方法,将 source 对象的所有可枚举属性复制到 target 对象中,如果 target 对象已经存在相同属性,则会被覆盖。 ```javascript let source = { name: 'Tom', age: 18 }; let target = {}; Object.assign(target, source); console.log(target); // { name: 'Tom', age: 18 } ``` 2. 使用展开运算符(...)进行拷贝。 ```javascript let source = { name: 'Tom', age: 18 }; let target = { ...source }; console.log(target); // { name: 'Tom', age: 18 } ``` 深拷贝: 1. 使用 JSON.parse(JSON.stringify(obj)) 方法进行深拷贝,该方法会将对象转换为 JSON 字符串,再将字符串转换为新的对象,从而实现深拷贝。但是该方法存在一些限制:不能拷贝函数、RegExp 等特殊对象,而且对象循环引用时会出错。 ```javascript let source = { name: 'Tom', age: 18, hobbies: ['swimming', 'reading'], friend: { name: 'Jerry', age: 17 } }; let target = JSON.parse(JSON.stringify(source)); console.log(target); // { name: 'Tom', age: 18, hobbies: ['swimming', 'reading'], friend: { name: 'Jerry', age: 17 } } ``` 2. 使用递归实现深拷贝,遍历对象的所有可枚举属性,如果属性值是对象,则递归调用深拷贝函数进行拷贝。 ```javascript function deepClone(obj) { let result = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { if (typeof obj[key] === 'object' && obj[key] !== null) { result[key] = deepClone(obj[key]); } else { result[key] = obj[key]; } } } return result; } let source = { name: 'Tom', age: 18, hobbies: ['swimming', 'reading'], friend: { name: 'Jerry', age: 17 } }; let target = deepClone(source); console.log(target); // { name: 'Tom', age: 18, hobbies: ['swimming', 'reading'], friend: { name: 'Jerry', age: 17 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值