对象的浅拷贝和深拷贝

浅拷贝:

             1.用for循环获取引用对象的属性和值,赋值给新对象:

Object.prototype.num=1;
	person1={
		name:'张三',
		age:12
	};
	function clone(origin,target){
		var tar=target || {};
		for(var key in origin){
			/*for in循环,原型中自定义的属性也会被循环出来;
			 * 所以用hasOwnPerperty,判断是否是实例中是属性
			 */
			if(origin.hasOwnProperty(key)){
				tar[key]=origin[key];
			};
		};
		return tar;
	};
	var person2=clone(person1);
	console.log(person1,person2);

深拷贝:

          1.还是利用for循环和递归,判断key值是原始值,还是引用值;


function deepClone(origin,target){
		var target=target||{},
			toStr=Object.prototype.toString,
			arrType='[object Array]';
		for(var key in origin){
			if(origin.hasOwnProperty(key)){
				if(typeof(origin[key])==='object'&&origin[key]!==null){
					if(toStr.call(origin[key])===arrType){/*判断是对象还是数组*/
						target[key]=[];
					}else{
						target[key]={};
					};
					/*递归*/
					deepClone(origin[key],target[key]);
				}else{
					target[key]=origin[key];
				}
			}
		};
		return target;
	};
var obj={
		name:'lee',
		age:456,
		children:{
			name:'wang',
			age:12,
			son:{
				name:'gwheo',
				age:10
			}
		},
		arr1:[1,2,3]
	};
	var Obj2=deepClone(obj);

          2.利用JSON实现深拷贝,问题是用json拷贝方法的时候,JSON这种方式就不行

var str=JSON.stringify(obj);
	var obj3=JSON.parse(str);

猜你喜欢

转载自blog.csdn.net/aliven1/article/details/88871824