TIL_37_221221

young0_0·2022년 12월 20일
0

TIL

목록 보기
36/91

37일 차 회고

참조에 의한 객체 복사

  • 원시값 (문자열, 숫자, 불린 값) - 값그대로 저장, 할당, 복사
  • 객체: 참조에 의해(by reference) 저장,복사
let user = {
	name: 'Jone'
}
// 객체가 그대로 저장되는 것이 아니라, 객체가 저장되어있는 메모리주소인 객체의 '참조 값' 이 저장된다
  • 객체가 할당된 변수를 복사할 땐 객체의 참조 값이 복사되고객체는 복사되지 않는다.
let user = {name : 'john'}
let admin = user // 참조값을 복사함
  • 객체에 접근하거나 객체를 조작할 땐 여러 변수를 사용할 수 있다.
let user = {name : 'Jone'}
let admin = user

admin.name = 'Pete'; //admin 참조 값에 의해 변경됨
alert(user.name) // 'Pete'가 출력됨. user 참조 값을 이용해 변경사항을 확인함

참조에 의한 비교

객체 비교 시 ==(동등) , ===(일치) 는 동일하게 동작

let a = {};
let b = a; 참조에 의한 복사

alert(a == b) // true 두 변수는 각ㅌ은 객체를 참조한다.
alert(a === b) //true

let a = {}
let b = {}
alert(a == b) // false 독립된 두 객체 이므로 

객체 복사, 병합과 object.assign

let user ={
	name: 'John',
	age: 30
}

let clone = {}

//빈 객체에 user 프로퍼티 전불르 복사해 넣는다.
for(let key in user){
	clone[key] = user[key]
}
// clone은 완전히 독립적인 복제본이 됨.
clone.name = 'Pete' // clone데이터 변경
alert(user.name)  // jhone

Object.assign

Object.assign(dest, [src1, src2, src3]) 
  • 첫 번째 인수 dest → 목표로 하는 객체
  • 인수 src1 … srcN 는 복사하고자 하는 객체 (…는 필요에 따라 얼마든지 많은 객체를 인수로 사용할 수 있음)
  • 객체 src1, … srcN의 프로퍼티를 dest에 복사, dest를 제외한 인수(객체)의 프로퍼티 전부가 첫 번째 인수(객체)로 복사된다.
  • 마지막으로 dest를 반환
let user = {name : 'Jone'}

let permissions1 = {canView:true}
let permissions2 = {candEdit : true}

//permissions1, permission2의 프로퍼티를 user로 복사
Object.assign(user, permissions1, permissions2)

//now user = {name : 'Jone', canView: true, canEdit:true}
  • 목표 객체 (user)에 동일한 이름을 가진 프로퍼티가 있는 경우엔 기존 값이 덮어씌워 진다.
  • Object.assign을 사용하면 반복문 없이도 간단하게 객체를 복사할 수 있다.
let user = {name:'Jone'}
Object.assign(user, {name:'Pete'})
alert(user.name) // user= {name : 'Pete'}

let user = {
	name:'Jone',
	age:30
}

let clone = Object.assign({}, user)

중첩 객체 복사

let user = {
	name = 'Jone'
	sizes : {
		height:182,
		width:50
	}
}

alert(user.sizes.height) // 182

let clone = Object.assign({}, user)
alert(user.sizes === clone.sizes) //true 같은 객체

// user 와 clone는 size를 공유한다.
user.sizes.width++; //한 객체에서 프로퍼트를 변경
alert(clone.sizes.width) // 51 다른 객체에서 변경사흥을 확인할 수 있다.

깊은복사(deep cloning)

user[key]의 각 값을 검사하면서 , 그 값이 객체인 경우 객체의 구조도 복사해주는 반복문을 사용 해야 한다.

profile
열심히 즐기자ㅏㅏㅏㅏㅏㅏㅏ😎

0개의 댓글