看栗子:
let obj = {
obj_pro_1:'1',
obj_pro_2:2
}
let obj2 = obj;
obj2.obj_pro_2=4;
console.log(obj.obj_pro_2);
//4,
此种方式并不是复制,而是把对象 obj 的引用给了obj2,两个对象同时只想一个堆对象,操作一个对象,
会影响另一个对象,如若想复制一个对象,需将 source 对象中的属性复制给target 对象,js中常用对象
例如Date,Array以及普通对象Object,一个复杂的数据结构中往往会至少包含Array属性或者Date属性
Date和Array对象处理方式与普通Object对象方式不同,上代码:
var cloneObj=function(obj){
//对象判空
if (null == obj || "object" != typeof obj) return obj;
//处理Date类型数据
if (obj instanceof Date) {var copy = new Date(); copy.setTime(obj.getTime()); return copy; }//处理数组类型数据
if (obj instanceof Array) {var copy = []; for (var i = 0,len = obj.length; i < len; ++i) { copy[i] = cloneObj(obj[i]); } return copy; }//处理Object
if (obj instanceof Object) {var copy = {}; for (var attr in obj) { if (obj.hasOwnProperty(attr))copy[attr] = cloneObj(obj[attr]);//递归调用,处理多级对象 } return copy; }
}
例子:
var date = new Date(); var obj = {1:1,2:[1,2,3],3:date};
var obj2 = obj;
var target = cloneObj(obj);
console.log(JSON.stringify(target)); console.log(JSON.stringify(obj)); console.log(target===obj);
console.log(obj===obj2);//结果:{"1":1,"2":[1,2,3],"3":"2017-09-25T02:55:09.798Z"} {"1":1,"2":[1,2,3],"3":"2017-09-25T02:55:09.798Z"} false //内存中两块不同的堆对象 true //引用指向同一个堆对象