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

来源:互联网 发布:芙蓉云计算数据朱震风 编辑:程序博客网 时间:2024/04/30 10:33
// *******数组的深浅复制****************/// 浅复制,导致引用类型都改变console.log('浅复制,导致引用类型都改变');var array1 = ['red','yellow','blue']; var array2 = array1;console.log(array1); array2[0] = 'changed';console.log(array1); console.log(array2); // 深复制,不影响前者,concatconsole.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);// 深复制,不影响前者,sliceconsole.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);   //2console.log(abObj.b.b1[0]); //Helloconsole.log(tarObj.a);      // 1console.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