对象深拷贝(让拷贝的对象与原对象不是同一引用)
- 如果内部没有引用数据或者时间正则null等等数据时
var obj = { name: "karen"}
var str = JSON.stringify(obj) //'{"name":"karen"}'
var obj2 = JSON.parse(str) //{name:"karen"}
console.log(obj2, obj == obj2) //{name:"karen"} false
- 什么数据都有,常常笔试题经常出现 (1)方法1. 最简单的方式,缺陷是原型链没有拷贝 函数和null不会拷贝
var copy1 = function (obj) {
return JSON.parse(JSON.stringify(obj));
}
var a = {a:function(){console.log('hello world')},b:{c:1},c:[1,2,3],d:"wanger",
e:new Date(),f:null,g:undefined}
var b = copy1(a)
(2)方法2.利用自调用
var copy1 = function (obj) {
if (obj === null) return null
if (typeof obj !== 'object') return obj;
if (obj.constructor === Date) return new Date(obj);
if (obj.constructor === RegExp) return new RegExp(obj);
var newObj = new obj.constructor(); //保持继承链
for (var key in obj) {
if (obj.hasOwnProperty(key)) { //不遍历其原型链上的属性
var val = obj[key];
newObj[key] = typeof val === 'object' ? arguments.callee(val) : val;
// 使用arguments.callee解除与函数名的耦合
}
}
return newObj;
};