JS 객체 복제본

1726 단어

간단한 복사:

function clone (source) {
	let target = {};
	for (let key in source) {
		if (source.hasOwnProperty(key)) {
			target[key] = source[key];
		}
	}
	return target;
}

//  
var a = {
		  name: "muyiy",
		  book: {
		      title: "You Don't Know JS",
		      price: "45"
		  },
		  a1: undefined,
		  a2: null,
		  a3: 123
	}
var b = clone(a);

a.name = " ";
a.book.price = "55";

console.log(b);

// { 
//   name: 'muyiy', 
//   book: { title: 'You Don\'t Know JS', price: '55' },
//   a1: undefined,
//   a2: null,
//   a3: 123
// }



 

딥 카피:

function deepClone (source) {
	if (!isObject(source)) {
		return source;
	}

	let target = Array.isArray(source) ? [] : {};

	for (let key in source) {
		if (source.hasOwnProperty(key)) {
			if (isObject(source[key])) {
				target[key] = deepClone(source[key]);
			} else {
				target[key] = source[key];
            }
        }
    }

	return target;

}

주: 이런 실현 방법은 순환 인용에 부딪히면 오류가 발생합니다.
해결 방안은 매우 간단하다. 사실은 순환 검측이다. 우리는 수조나 해시표를 설정하여 복사된 대상을 저장하고 현재 대상이 해시표에 존재하는 것을 검출할 때 이 값을 꺼내 되돌려주면 된다.
 

		function deepClone (source, hash = new WeakMap()) {
			if (!isObject(source)) return source;

			if (hash.has(source)) return hash.get(source);

			let target = Array.isArray(source) ? [] : {};
			hash.set(source, target);

			for (let key in source) {
				if (source.hasOwnProperty(key)) {
					if (isObject(source[key])) {
						target[key] = deepClone(source[key], hash);
					} else {
						target[key] = source[key];
					}
				}
			}
			return target;
		}

 
완벽해!!!!!!

좋은 웹페이지 즐겨찾기