javascript深度复制,适合大部分数据情况,可多层嵌套对象,有其他不支持的类型,请留言,我会进行完善

javascript深度复制,适合大部分数据情况,可多层嵌套对象,有其他不支持的类型,请留言,我会进行完善

/**
 * 深度复制
 * obj{any}要复制的对象
 * hashWeakMap {WeakMap} 软引用解决循环引用问题
 */
const deepClone = function(obj, hashWeakMap = new WeakMap()) {
	if (obj === null) {
		return null;
	}
	if (!['[object Object]', '[object Array]'].includes(Object.prototype.toString.call(obj))) {
		return obj;
	}

	if (hashWeakMap.has(obj)) {
		return hashWeakMap.get(obj);
	}

	const resObj = Array.isArray(obj) ? [] : {};

	hashWeakMap.set(obj, resObj);

	Reflect.ownKeys(obj).forEach(key => {
		resObj[key] = deepClone(obj[key], hashWeakMap);
	});

	return resObj;
};

测试字符

/**
* 构造一个尽可能全面的数据类型对象,进行测试复制
*/
const oldObject = {
    //number
	s: 1,
	//string
	b: '2',
	//boolean
	f: true,
	//Date
	d: new Date(),
	//RegExp
	r: /^1[0-9]{10}/,
	//Boolean对象
	f: new Boolean(true),
	//Array
	m: [
		1,
		23,
		5,
		6,
		//function
		() => {
			return { t: 's', m: 'p' };
		}
	],
	//对象
	p: {
		s: '1',
		l: '2',
		q: () => {
			console.log('123');
		}
	},
	count: 0,
	//Symbol迭代
	[Symbol.iterator]: () => {
		return {
			next: () => {
				if (oldObject.count < 10) {
					oldObject.count++;
					return {
						done: false,
						value: oldObject.count
					};
				}
				return {
					done: true,
					value: oldObject.count
				};
			}
		};
	}
};
//使用target进行循环引用,测试是否会正常复制
oldObject.target = oldObject;

测试结果

javascript深度复制,适合大部分数据情况,可多层嵌套对象,有其他不支持的类型,请留言,我会进行完善_第1张图片

你可能感兴趣的:(JavaScript,javascript,前端,es6)