浅克隆和深克隆

浅克隆和深克隆的实现 

var tem = "[object Array]";
			// 区分对象和数组
			function test() {
				if (typeof(arguments[0]) == "object") {
					if (Object.prototype.toString.call(arguments[0]) == tem) {
						console.log("数组");
					} else {
						console.log("对象");
					}
				} else {
					console.log("不是对象");
				}
			}

			function test1() {
				if (arguments[0] instanceof Array) {
					console.log("数组");
				} else {
					console.log("对象");
				}
			}
			var obj = {
				name: "abc",
				age: 12,
				cord: ["2", "3"],
			}
			var obj1 = {};
			//浅拷贝
			function clone(origin, target) {
				var target = target || {};
				for (var prop in origin) {
					target[prop] = origin[prop];
				}
			}
			clone(obj, obj1);
			// 深度克隆完之后不管是引用值还是原始值的改变都不会影响源对象
			// 先判断是不是原始值 typeof() object
			// 判断是数组还是对象  instancof  Object.prototype.toString.call  constructor
			// 建立相应的数组或对象
			function deepClone(origin, target) {
				var target = target || {},
					//用来判断是数组还是对象
					toStr = Object.prototype.toString,
					//存放数组类型的String
					arrStr = "[object Array]";
				//遍历对象
				for (var prop in origin) {
					//只克隆对象的属性,不拿他原型链上的属性
					if (origin.hasOwnProperty(prop)) {
						// 判断当前是不是对象
						if (origin[prop] !== "null" && typeof(origin[prop]) == "object") {
							// 是数组建立一个空数组是对象建立一个空对象
							target[prop] = toStr.call(origin[prop]) == arrStr ? [] : {};
							//再次克隆对象内部
							deepClone(origin[prop], target[prop]);
						} else {
							target[prop] = origin[prop];
						}
					}
				}
				return target;
			}
			deepClone(obj, obj1);

 

你可能感兴趣的:(JS)