对象的指针
对象是一个复杂数据类型,声明一个对象就开辟一个空间然后给这个空间取个名字。而这个空间可以有多个名字,而空间只能有一个。什么意思呢?上代码:
var obj = {
a: 1,
b: 2
}
var obj1 = obj;
obj.c = 3;
obj.a = 8;
console.log(obj1.c); // 3
console.log(obj1.a); // 8
从上面的代码可以看出来,obj和obj1只是对象的两个名字而对象就是一个。ok我们再做个实验:
var obj = {
a: 1,
b: 2
}
var obj1 = obj;
console.log(obj == obj1); //true
console.log({} == {}); //false
说明obj和obj1 就是一个对象, 而两个空对象不相等更说明两个空对象属于两个不同的空间。那这就产生了一个问题,如果我们想复制一个对象出来,复制出来之后两个对象就断掉关系怎么办呢?
对象克隆
我们来想想办法,首先我们是不是要把对象中每一项拿出来搞搞呢:
var obj = {
a: 1,
b: 2
}
var obj1 = {}
for (var prop in obj) {
obj1[prop] = obj[prop];
}
obj.a = 4;
console.log(obj1); // {a:1, b:2}
}
哈哈,看起来问题解决了,但是还有坑的! 上代码:
var obj = {
list: {
item1: 'a',
item2: 'b',
},
arr: [1, 2, 3]
}
var obj1 = {}
for (var prop in obj) {
obj1[prop] = obj[prop];
}
obj.arr[0] = 5;
console.log(obj1.arr[0]); // 5
艾玛呀。。。看来科隆的不够深,上面的代码我们可以看出来,原始值是没有问题的,主要是引用值,而引用值主要是对象和数组,我们首先要先判断一下是数组还是对象,然后再分别处理,那该怎么办呢?好办:
function copy(a, b) {
var b = b || {},
tosrt = Object.prototype.toString,
s = "[object Array]";
for (var prop in a) {
if (a.hasOwnProperty(prop)) { // 不克隆原型链欧
if (typeof (a[prop]) == 'object' && a[prop] != null) { //首先判断是不是引用值
if (tosrt.call(a[prop]) == '[object Array]') { // 判断是数组还是对象
b[prop] = [];
} else {
b[prop] = {};
}
copy(a[prop], b[prop]);
} else {
b[prop] = a[prop];
}
}
}
我觉得自己封装的很完美,如有不妥请拍砖!!