1.浅拷贝
当把数组或对象简单赋值给其他变量的时候,实际上进行的是浅拷贝,浅拷贝是拷贝引用,只是将拷贝后的引用指向同一个对象实例,彼此间的操作还会互相影响。
分为两种情况:
直接拷贝源对象的引用
var a = { c : 1};
var b = a ;
console.log( a === b); // true
a.c = 2 ;
console.log( b.c ); // 2
源对象拷贝实例,但其属性拷贝引用。
var a = [{ c:1 },{d:2} ];
var b = a.slice( );
console.log( a === b ); // false 说明外层数组拷贝的是实例
a[0].c = 3;
console.log( b[0].c ); // 3 //说明元素拷贝是引用
2.深拷贝
在堆中重新分配内存,并且把源对象所有属性都进行新建拷贝,拷贝后的对象与原来的对象完全隔离,互不影响。
如何实现深拷贝?只要递归调用“浅拷贝”就行了。
function deepCopy( p , c ){
var c = c || {} ;
for(var i in p){
If( typeof p[ i ] === “object” ){
c[ i ] = ( p[ i ].constructor === Array )? [ ] : { };
deepCopy(p[ i ], c[ i ]);
}else{
c[ i ] = p[ i ];
}
}
return c;
}
jquery中的$.extend( )方法可以实现深拷贝,源码原理也是递归使用浅拷贝。
注意ES6的新方法Object.assign( target , obj )实现的是浅拷贝。
3.javascript判断对象是否相等 “==“ ,”===”
对象和数组这种复杂数据类型在判断是否相等时,判断的是二者指向的内存地址是否一致,并不是以是否有相同的属性,属性是否有相同的值为标准。
如,
var obj1 = {name : ‘Mack’, age : 21};
var obj2 = {name : ‘Mack’, age : 21};
console.log(obj1 === obj2); //false
var obj3 = obj1;
console.log(obj1 === obj3); //true
ES6中的Object.is( )在复杂数据类型的判断机制上和 ‘===’ 是一样的(不同之处只有两个,一个是 +0和-0,第二个是NaN和其本身)。