对象,数组,字符串,数字,date的深复制浅复制问题

// *******数组的深浅复制****************/
// 浅复制,导致引用类型都改变
console.log('浅复制,导致引用类型都改变');
var array1 = ['red','yellow','blue']; 
var array2 = array1;
console.log(array1); 
array2[0] = 'changed';
console.log(array1); 
console.log(array2); 

// 深复制,不影响前者,concat
console.log('深复制,不影响前者,concat');
var array1 = ['red','yellow','blue']; 
var array2 = array1.concat('purple','purple2');
var array3 = array2.concat(['purple3'],'purple4');
var array4 = array3.concat();
console.log(array1);
console.log(array2);
console.log(array3);
console.log(array4);

// 深复制,不影响前者,slice
console.log('深复制,不影响前者,slice');
var array1 = ['red','yellow','blue']; 
var array2 = array1.slice(1);
console.log(array1);
console.log(array2);


// *******对象且数组的深浅复制****************/
console.log('百度ife-对象等的深浅复制');   
// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等
function cloneObject(src) {
    if ((src instanceof Object) && (!(src instanceof Array))) {
        var result = {};
        for (var propName in src) {
            result[propName] = arguments.callee(src[propName]);
        }
        return result;
    } else if (src instanceof Array) {
        return src.concat();
    } else {
        return src;
    }
}

// 测试用例:
var srcObj = {
    a: 1,
    b: {
        b1: ["hello", "hi"],
        b2: "JavaScript"
    }
};
var abObj = srcObj;
var tarObj = cloneObject(srcObj);

srcObj.a = 2;
srcObj.b.b1[0] = "Hello";
srcObj.b.b1[2] = "Hello2";

console.log(abObj.a);   //2
console.log(abObj.b.b1[0]); //Hello

console.log(tarObj.a);      // 1
console.log(tarObj.b);      // Object 
console.log(tarObj.b.b1[0]);    // "hello"
console.log(tarObj.b.b1[2]);    // "undefined"

// 
console.log("复制数组");
var array1 = ['red','yellow','blue']; 
var array2 = cloneObject(array1);
array2[0] = 'changed';
console.log(array1); 
console.log(array2); 
// 
console.log("复制字符串");
var x = 'sqf';
var y = cloneObject(x);
x = '222';
console.log(x); 
console.log(y); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值