要是实在不知道要干什么,那就喝两杯思路就来了!

导航菜单

深克隆方法的封装

对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没   有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变,而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

function type (obj) {
  let toString = Object.prototype.toString
  let map = {
    '[object Boolean]': 'boolean',
    '[object Number]': 'number',
    '[object String]': 'string',
    '[object Function]': 'function',
    '[object Array]': 'array',
    '[object Date]': 'date',
    '[object RegExp]': 'regExp',
    '[object Undefined]': 'undefined',
    '[object Null]': 'null',
    '[object Object]': 'object'
  }
  return map[toString.call(obj)]
}

function deepCopy (data) {
	let type = type(data)
	let newData
	let i
	let len
	if (type === 'array') {
		newData = []
	} else if (type === 'object') {
		newData = {}
	} else {
		return data
	}
	if (type === 'array') {
		for (i = 0, len = data.length; i < len; i++) {
			newData.push(deepCopy(data[i]))
		}
		return newData
	} else if (type === 'object') {
		for (i in data) {
			newData[i] = deepCopy(data[i])
		}
		return newData
	}
}

二、新版的深拷贝,早上利用上班一会时间弄出来的,欢迎来喷! (2019.5.17)

function deepCopy (origin) {
	if (origin === undefined) return;
	if (!(origin instanceof Object)) return origin;
	var target = new origin.constructor;
	for (var key in origin) {
		if (!(origin[key] instanceof Object)) {
			target[key] = origin[key];
		} else {
			target[key] = deepCopy(origin[key]);
		}
	}
	return target;
}

这个方法不仅可以拷贝引用值,而且基本值也支持,在原有的基础上缩减了更多的冗余代码,提高了容错率。

发表评论