[국비지원교육] [패스트캠퍼스] React 강의 6주차 (1) -JS 데이터 (Javascript)
[Javascript] 데이터 (data)
- 객체 (Object)
- 구조 분해 할당
- 전개 연산자
- 불변성
- 얕은 복사와 깊은 복사
1. 객체 (Object)
Object 클래스는 JavaScript의 데이터 유형 중 하나를 나타냅니다. 다양한 키 모음 및 더 복잡한 엔티티들을 저장하는 데 사용됩니다. 객체는 Object() 생성자 또는 객체 초기자 / 리터럴 구문를 통해 생성할 수 있습니다
1) Object.assign()
Object.assign() 메서드는 출처 객체들의 모든 열거 가능한 자체 속성을 복사해 대상 객체에 붙여넣습니다. 그 후 대상 객체를 반환합니다.
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target);// Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget === target);// true
//Object
const userAge = {
//key: value
name: 'adlog',
age: 100
}
const userEmail = {
name: 'adlog',
email: 'adlog@gmail.com'
}
const target = Object.assign(userAge, userEmail)
console.log(target); //{name: 'adlog', age: 100, email: 'adlog@gmail.com'}
console.log(userAge) //{name: 'adlog', age: 100, email: 'adlog@gmail.com'}
console.log(userEmail) //{name: 'adlog', email: 'adlog@gmail.com'}
console.log(target === userAge) //true, 실제 저장 위치는 하나고, 같은 장소를 바라보고 있어서 true
const a = {k: 123}
const b = {k: 123}
console.log( a === b) //false , 다른 장소를 바라보고 있어서 false
//생긴 것은 같지만 다르다.
// userAge라는 변수는 특정한 객체의 메모리 주소만 참고하고있습니다. (참조형 데이터)
// {} 객체 데이터
// [] 배열 데이터
// function 함수형 데이터
const target2 = Object.assign({}, userAge, userEmail)
console.log(target); //{name: 'adlog', age: 100, email: 'adlog@gmail.com'}
console.log(target2 === userAge) //false
const target3 = Object.assign({}, userAge)
// 복사하는 용도로 사용할 수 있습니다.
2. 구조 분해 할당 - 비구조화 할당
const user = {
name: 'adlog',
age: 100,
email: 'adlog@gmail.com'
}
const {name, age, email, address} = user
// E.g, user.adderss
//필요한 것들만 꺼내서 사용할 수 있습니다.
console.log(`사용자의 이름은 ${name}입니다.` ) //사용자의 이름은 adlog입니다.
console.log(`${name}의 나이는 ${age}세 입니다. `) //adlog의 나이는 100세 입니다.
console.log(address) //undefined
const user = {
name: 'adlog',
age: 100,
email: 'adlog@gmail.com',
address: 'USA'
}
//특정한 데이터를 추가할때 아래처럼 활용할 수 있습니다.
const {name, age, email, address = 'Korea', address2 = 'Korea'} = user
console.log(address) //USA
console.log(address2) //Korea
배열 데이터
const fruits = ['Apple', 'Banana', 'Cherry']
const [a, b, c, d] = fruits
console.log(a,b,c,d) //Apple Banana Cherry undefined
const fruits = ['Apple', 'Banana', 'Cherry']
const [, , b] = fruits
console.log(b) //Cher
3. 전개 연산자 (Spread)
const fruits = ['Apple', 'Banana', 'Cherry', 'Orange']
console.log(fruits) //(3) ['Apple', 'Banana', 'Cherry', 'Orange']
console.log(...fruits) //Apple Banana Cherry Orange
function toObject(a, b, c){
return {
a: a,
b: b,
c: c,
}
}
console.log(toObject(...fruits)) //{a: 'Apple', b: 'Banana', c: 'Cherry'}
console.log(toObject(fruits[0],fruits[1],fruits[2])) //{a: 'Apple', b: 'Banana', c: 'Cherry'}
function toObject(a, b, ...c){
return {
a: a,
b: b,
c: c,
}
}
console.log(toObject(...fruits)) //{a: 'Apple', b: 'Banana', c: Array(2)}
//a: "Apple"
//b: "Banana"
//c: (2) ['Cherry', 'Orange']
[축약형으로 정리]
const toObject = (a, b, ...c) => ({a, b, c})
console.log(toObject(...fruits)) //{a: 'Apple', b: 'Banana', c: Array(2)}
4. 데이터 불변성 (Immutability)
1) 원시 데이터 : String, Number, Boolean, undefined, null (자바스크립트에서 사용할 수있는 기본 데이터)
2) 참조형 데이터 : Object, Array, Function
let a = 1;
let b = 4;
console.log(a, b, a === b) //1 4 false
b = a
console.log(a, b, a === b) //1 1 true
a = 7
console.log(a, b, a === b) //7 1 false
let c = 1
console.log(b, c, b === c) //1 1 true
let a = {k: 1}
let b = {k: 1}
console.log(a, b, a === b) //{k: 1} {k: 1} false
a.k = 7
b = a
console.log(a, b, a === b) //{k: 7} {k: 7} true
a.k = 2
console.log(a, b, a === b) //{k: 2} {k: 2} true
let c = b
console.log(a, b, c, a === c) //{k: 2} {k: 2} {k: 2} true
a.k = 9
console.log(a, b, c, a === c) //{k: 9} {k: 9} {k: 9} true
어떤 특정 데이터를 수정했더니, 다른곳에서 수정될 수 있는 실수가 발생합니다.
참조형 데이터를 다른 변수를 참조할때, 실제 메모리상에서 분리하여 위 부분을 복사하여 사용하여 사용해야 됩니다. (얕은 복사, 깊은복사)
5. 얕은 복사 (Shallow copy), 깊은 복사 (Deep copy)
const user = {
name: 'adlog',
age: 100,
email: 'adlog@gmail.com',
}
const copyUser = user
console.log(user === copyUser) //true
user.age = 22
console.log('user', user) //user {name: 'adlog', age: 22, email: 'adlog@gmail.com'}
console.log('copyUser', copyUser) //copyUser {name: 'adlog', age: 22, email: 'adlog@gmail.com'}
// 같은 데이터를 수정하기때문에 유저부분의 값이 같이 바뀌게 될것 입니다.
// 만약 의도치 않게 위 부분을 변하게 하지 않기 위해서는 복사를 이용하여야 합니다.
const user = {
name: 'adlog',
age: 100,
email: 'adlog@gmail.com',
}
const copyUser = Object.assign({}, user)
console.log(user === copyUser) //false
user.age = 22
console.log('user', user) //user {name: 'adlog', age: 22, email: 'adlog@gmail.com'}
console.log('copyUser', copyUser) //copyUser {name: 'adlog', age: 100, email: 'adlog@gmail.com'}
//[전개연산자 (얕은 복사)]
const copyUser = {...user}
console.log(user === copyUser) //false
user.age = 22
console.log('user', user) //user {name: 'adlog', age: 22, email: 'adlog@gmail.com'}
console.log('copyUser', copyUser) //copyUser {name: 'adlog', age: 100, email: 'adlog@gmail.com'}
const user = {
name: 'adlog',
age: 100,
email: ['adlog@gmail.com']
}
const copyUser = {...user}
console.log(user === copyUser) //false
user.age = 22
console.log('user', user) //user {name: 'adlog', age: 22, email: Array(1)}
console.log('copyUser', copyUser) //copyUser {name: 'adlog', age: 100, email: Array(1)}
user.email.push('neo@gmail.com')
console.log(user) //{name: 'adlog', age: 22, email: Array(2)}
console.log(user.email === copyUser.email) //true
console.log('user', user) //user {name: 'adlog', age: 22, email: Array(2)}
console.log('copyUser', copyUser) //copyUser {name: 'adlog', age: 100, email: Array(2)}
> package.json 깊은 복사 lodash 설치
> 터미널을 열어서 아래와 같이 설치합니다.
import _ from 'lodash'
const user = {
name: 'adlog',
age: 100,
email: ['adlog@gmail.com']
}
const copyUser = _.cloneDeep(user)
console.log(user === copyUser) //false
user.age = 22
console.log('user', user) //user {name: 'adlog', age: 22, email: Array(1)}
console.log('copyUser', copyUser) //copyUser {name: 'adlog', age: 100, email: Array(1)}
user.email.push('neo@gmail.com')
console.log(user) //{name: 'adlog', age: 22, email: Array(2)}
console.log(user.email === copyUser.email) //false
console.log('user', user) //user {name: 'adlog', age: 22, email: Array(2)}
console.log('copyUser', copyUser) //copyUser {name: 'adlog', age: 100, email: Array(1)}
참조형 데이터가 또다른 참조형 데이터를 들고있다고 하면, 깊은 복사를 통해 해줘야 더 안전합니다.
lodash라는 패키지를 이용하여 쉽게 이용할 수 있습니다.
1) Object
Object - JavaScript | MDN
Object 클래스는 JavaScript의 데이터 유형 중 하나를 나타냅니다. 다양한 키 모음 및 더 복잡한 엔티티들을 저장하는 데 사용됩니다. 객체는 Object() 생성자 또는 객체 초기자 / 리터럴 구문를 통해 생
developer.mozilla.org
2) lodash (깊은 복사)
https://lodash.com/docs/4.17.15#cloneDeep
Lodash Documentation
_(value) source Creates a lodash object which wraps value to enable implicit method chain sequences. Methods that operate on and return arrays, collections, and functions can be chained together. Methods that retrieve a single value or may return a primiti
lodash.com
var objects = [{ 'a': 1 }, { 'b': 2 }];
var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// => false
[Javascript] 데이터 (data)
- 객체
- 구조 분해 할당
- 전개 연산자
- 불변성
- 얕은 복사와 깊은 복사
'스터디 > React' 카테고리의 다른 글
[React] 강의 7주차 (1) - React 구현 전 확인사항 (0) | 2022.12.07 |
---|---|
[React] 강의 6주차 (3) -JS 데이터 (Javascript) (0) | 2022.12.07 |
[React] 강의 6주차 (1) -JS 데이터 (Javascript) (0) | 2022.11.17 |
[React] 강의 5주차 (2) -JS (Javascript) 함수 (0) | 2022.11.16 |
[React] 강의 5주차 (1) -JS (Javascript) (0) | 2022.11.15 |