1.浅拷贝当简单地将数组或对象赋值给另一个变量时,实际上是浅拷贝。浅拷贝是复制引用,但是复制的引用指向同一个对象实例,彼此之间的操作也会相互影响。有两种情况:直接复制源对象的引用vara={c:1};变量b=a;console.log(a===b);//真a.c=2;console.log(b.c);//2源对象复制实例,但其属性复制引用。vara=[{c:1},{d:2}];varb=a.slice();console.log(a===b);//false表示外部数组复制实例a[0].c=3;console.log(b[0].c);//3//表示元素拷贝是引用2.深拷贝在堆中重新分配内存,并创建源对象的所有属性Copy,拷贝的对象与原对象完全隔离,互不影响。如何实现深拷贝?只需递归调用“浅拷贝”即可。函数deepCopy(p,c){varc=c||{};for(variinp){If(typeofp[i]==="object"){c[i]=(p[i].constructor===Array)?[]:{};deepCopy(p[i],c[i]);}else{c[i]=p[i];}}returnc;}$jquery中的.extend()方法可以实现深拷贝,源码的原理也是递归使用浅拷贝。请注意,ES6的新方法Object.assign(target,obj)实现了浅拷贝。3、Javascript判断对象是否相等"==","==="在判断对象、数组等复杂数据类型是否相等时,判断的是两者指向的内存地址是否一致,而不是是否有相同的Attribute,以属性值是否相同为判断标准。例如,varobj1={name:'Mack',age:21};varobj2={name:'Mack',age:21};控制台日志(obj1===obj2);//假varobj3=obj1;控制台日志(obj1===obj3);//trueES6中的Object.is()和复杂数据类型判断机制中的'==='是一样的(区别只有两点,一是+0和-0,二是NaN和它自己)。
