1、javascript 的浅拷贝和深拷贝
1.js的浅拷贝(浅克隆);
例子:
var test = { a:"1",b:"2"};
var test2 = test // 即完成拷贝;
test2.a = 10;
console.log(test2.a) // 10;
console.log(test.a) // 10;
// 说明: 因为数组和对象都是复杂数据类型,所以上述方法不是简单的传值,而是传址; 这样一旦改变test2中属性的属性值,那么test中的值也会相应的改变,这肯定不是我们所想要的结果,所以深拷贝就自然而然出现了。
2.js的深拷贝(深克隆)
// 下面是封装的一个深拷贝的函数;
function deepClone(data){
// 1.声明一个变量来存储拷贝的数据;
var o ;
// 2.根据判断的数据类型来定义声明的变量的数据类型;
if(data instanceof Array){
o = [];
}else if(typeof(data)==="object"){
o = {};
}else{
return data;
}
// 3.根据判断的结果来进行拷贝;
if(data instanceof Array){
for(var i =0; i< data.length; i++){
o.push(deepClone(data[i])) // 重复调用上述方法,以防止数组里面嵌套的还有数组
}
return 0 ;
}else if(typeof(data)==="object"){
for(var key in data){
o[i] = deepClone(data[key]); //重复调用上述方法,以防止对象里面嵌套的还有对象;
}
return o;
}
}
3.js的深拷贝(深克隆)的另一种写法:
function clone(Obj) {
var buf;
if (Obj instanceof Array) {
buf = []; // 创建一个空的数组
var i = Obj.length;
while (i--) {
buf[i] = clone(Obj[i]);
}
return buf;
} else if (Obj instanceof Object){
buf = {}; // 创建一个空对象
for (var k in Obj) { // 为这个对象添加新的属性
buf[k] = clone(Obj[k]);
}
return buf;
}else{
return Obj;
}
}
2、jquery的浅拷贝和深拷贝;
1.jquery的浅拷贝(浅克隆),此方法只会拷贝最顶层的非object对象;
var obj1 = {a:"123",b:"456"};
var obj2 = $.extend({},obj1); // 完成复制
2.jquery的深拷贝(深克隆),一层一层往下复制直到最底层;
例:
var obj3 = {
a:"111",
b:[1,2,3,{c:"s1"}],
c:{d:"s3",e:[4,5,6]}
};
var obj4 = $.extend(true,{},obj3);
obj4.a = "sss";
obj4.b[0] = 100;
obj4.c.e.[0] = 400;
console.log(obj3);
console.log(obj4)
// 说明: obj4内部属性的值改变之后,如果obj3中的相应值保持不变,就说明复制成功。
3、json实现拷贝(克隆)
1.json实现克隆,先通过json.stringify一下,然后在json.parse一下,就能实现深拷贝,需要注意的是json格式的拷贝的数据类型只支持基本数据类型;
例:
var obj = {"a":"123", "b":function(){console.log("cc")}}
var obj1 = JSON.stringify(obj);
console.log(JSON.parse(obj1)) // "{"a":"123"}" ;
// 说明: 在json.stringify()方法中会把不是基本数据类型的数据都会过滤掉。因此,function函数就不存在了。