// *******数组的深浅复制****************/
// 浅复制,导致引用类型都改变
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);
对象,数组,字符串,数字,date的深复制浅复制问题
最新推荐文章于 2023-11-23 13:56:36 发布