[JavaScript]객체 - 참조에 의한 객체 복사
11016 단어 JavaScriptjsJavaScript
- 객체와 원시 타입의 근본적인 차이 중 하나는 객체는 ‘참조에 의해(by reference)’ 저장되고 복사된다는 것
let message = "hello";
let phrase = message;
- 변수엔 객체가 그대로 저장되는 것이 아니라, 객체가 저장되어 ‘메모리 주소’인 객체에 대한 ‘참조 값’ 저장’
- 객체는 메모리 내 어딘가에 저장, 변수 user엔 객체를 참조할 수 있는 값 저장
- 객체가 할당된 변수를 복사할 땐 객체의 참조 값이 복사되고 객체는 복사되지 않음
let user = {name : "John"};
// 참조값을 복사함
let admin = user;
→ 객체에 접근하거나 객체를 조작할 땐 여러 변수 사용
- 객체 : 서랍장 | 변수 : 서랍장을 열 수 있는 열쇠
- 서랍장을 열 수 있는 열쇠는 두 개, 그 중 하나(admin)를 사용해 서랍장을 열어 정돈 → 또 다른 열쇠로 서랍장을 열면 정돈된 내용 볼 수 있음
let user ={ name: "John" } let admin = user; admin.name = "Pete"; // admin 참조 값에 의해 변경됨 console.log(admin); // Pete | user 참조 값을 이용해 변경사항 확인
참조에 의한 비교
- 객체 비교시 동등 연산자 == 와 일치 연산자 ===는 동일하게 동작
- 비교 시 피연산자인 두 객체가 동일한 객체인 경우 참 반환
- 독립된 객체는 일치-동등 비교하면 거짓이 반환
let a = {} let b = {} console.log(a == b) //false
- obj1 > obj2 같은 대소 비교나 obj == 5 같은 원시값과의 비교에선 객체가 원시형으로 변환
객체 복사, 병합과 Object.assign
- 객체가 할당된 변수 복사하면 동일한 객체에 대한 참조 값이 하나 더 만들어짐
- 기존에 있던 객체와 똑같으면서 독립적인 객체 만들기
- 자바스크립트는 객체 복제 내장 메서드 지원 X ⇒어려움
- 새로운 객체 만든 다음 기존 객체의 포르퍼티들을 순회해 원시 수준까지 프로퍼티 복사
let user = { name: "John", age: 30 }; // 새로운 빈 객체 let clone = {}; // 빈 객체에 user 프로퍼티 전부를 복사해 넣습니다. for (let key in user) { clone[key] = user[key]; } // 이제 clone은 완전히 독립적인 복제본이 되었습니다. clone.name = "Pete"; // clone의 데이터를 변경합니다. console.log( user.name ); //John console.log( clone ); // { name: 'pete', age: 30 }
- Object.assign 사용
Object.assign(dest, [src1, src2, src3...])
- assign 메서드를 사용해 여러 객체를 하나로 병합
let users = { name: "John"}; let permission1 = { canView: true}; let permission2 = { canEdit : true}; //permission1,2 프로퍼티 suer로 복사 Object.assign(users, permission1, permission2); console.log(users); // { name: 'John', canView: true, canEdit: true }
- Object.assign 사용하면 반복문 없이도 간단하게 객체 복사 가능
let user = { name: "John", age: 30 }; let clones = Object.assign({}, user); console.log(clones); //{ name: 'John', age: 30 }
중첩 객체 복사
- 프로퍼티는 다른 객체에 대한 참조 값일 수도 있음
let user = { name: "John", sizes: { height: 182, width: 50 } };
- 객체의 '진짜 복사본’을 만들려면 '얕은 복사(shallow copy)'를 가능하게 해주는
Object.assign
이나 '깊은 복사’를 가능하게 해주는 _.cloneDeep(obj) 사용 - 얕은 복사본은 중첩 객체를 처리하지 못함
let cclone = Object.assign({}, user); console.log(user.sizes === cclone.size) user.sizes.width++; console.log(cclone.sizes.width);
Author And Source
이 문제에 관하여([JavaScript]객체 - 참조에 의한 객체 복사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@scalla31/객체-참조에-의한-객체-복사저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)