- 구조 분해 할당 - 객체 / 배열의 구조 분해 할당
console.group('@ 객체의 구조 분해 할당')
// 구조분해해서 원하는 데이터만 사용할 수 있음
const { name: me, age, email, address = 'Korea' } = user
console.log(`이름은 ${name}입니다.`)
console.log(`${me}의 이름은 ${age}살이며`) //me라는 이름으로 대체해서 가져올 수 있다. 그럼 name이란 변수는 사용할수없음!
console.log(`${address} 에 거주중입니다.`) //구조분해할당시 default 값 지정할 수 있다 !
console.log(`문의사항이 있다면 -> ${email}`)
console.log(user.name === `${name}`) // true !
console.groupEnd()
console.group('@ 배열의 구조 분해 할당')
const fruits = ['Apple', 'Banana', 'Cherry']
const [ a, b, c, d ] = fruits
console.log(a, b, c, d) // Apple Banana Cherry undefined
const [, , x ] = fruits // 건너뛰어서 추출
console.log(x) // 3번째 데이터 출력
- 전개 연산자 Spread : 문자열로 전개하여 출력
console.group('@ 전개 연산자 Spread ')
console.log(fruits) // 배열로 출력
console.log(...fruits) // 문자열로 전개해서 출력
function toObject(a,b,c) {
return {
a: a,
b: b,
c: c
}
}
console.log(toObject(...fruits)) //{ a:'apple', b:'banana' , ...}
console.log(toObject(fruits[0], fruits[1], fruits[2])) // 위와 동일
fruits.push('Orange')
const toObject2 = (a,b, ...c) => ({a,b,c})
console.log(toObject2(...fruits)) // Cherry와 Orange가 c에 묶여 Array로 출력됨
console.groupEnd()
- 데이터 불변성 Immutability
// 원시 데이터 : String, number, Boolean, undefined, null, ...
// 참조형 데이터 : Object, Array, Function
console.group('@ 데이터 불변성')
let aa = 1; let bb = 4;
console.log(aa, bb, aa === bb) // 1 4 false 메모리가 다른곳에 할당
bb = aa
console.log(aa, bb, aa === bb) // 1 1 true 메모리의 주소가 동일
aa = 7
console.log(aa, bb, aa === bb) // 7 1 false
let cc = 1
console.log(bb, cc, bb === cc) // 1 1 true
console.groupEnd()
// 얕은 복사 : 겉 표면만 복사
// 깊은 복사 : 내부의 모든 참조 관계까지 새로 복사
// 참조형 데이터 관리 할 때 bb = aa와 같은 할당연산자를 쓰는것은 문제를 발생 시킬 수 있으므로
// 일반적으로는 복사라는 개념으로 aa와 bb를 분리해주어야한다.
- 얕은복사와 깊은복사
console.group('@ 얕은 복사 / 깊은 복사')
// const copyUser = user
// console.log(copyUser === user) //true
// user.age = 22
// console.log('user', user)
// console.log('copyUser ', copyUser)
// user의 age만 변경했을 뿐인데 copyUser의 age도 22로 변경이 된다.
// 가리키고 있는 값이 똑같기 때문!!
// 얕은 복사 :
const copyUser2 = Object.assign({}, user)
console.log(copyUser2)
console.log(copyUser2 === user) // false
const copyUser3 = {...user}
console.log(copyUser3)
console.log(copyUser3 === user) // false
user.emails.push('solyi@choi.com')
console.log(user.emails === copyUser3.emails) //true
//복사한적 없지만 emails 같은 메모리 주소를 공유한다.
// 그래서 깊은 복사를 해야함!!!
// 깊은 복사 : 참조형 데이터 내부에서 또 참조형 데이터가 사용될 경우에 꼭 깊은 복사
// JS 만으로는 구현이 어렵기 때문에 lodash를 추가 설치 해주어야 한다.
// 상단에 import _ from 'lodash'
const copyUser4 = _.cloneDeep(user) //lodash를 이용한 깊은 복제
console.log(copyUser4 === user) //값이 다름
// console error .. .
// Uncaught SyntaxError: Cannot use import statement outside a module
// https://lodash.com/docs/4.17.15
// 재귀? 하나의 데이터 안에서 반복적으로 실행되는것
// 반복실행 하면서 모두 복사한다
반응형
'Frontend > JavaScript' 카테고리의 다른 글
[Javascript] lodash의 설명과 예제, 자주 쓰는 함수 (0) | 2021.10.29 |
---|---|
[Javascript] Named Export / export default (0) | 2021.10.29 |
[Javasciprt] 객체 Object (0) | 2021.10.27 |
[Javascript] 배열 Array (0) | 2021.10.27 |
[Javascript] 문자열 / 숫자와 수학 (0) | 2021.10.27 |