클린코드 자바스크립트 6-1 객체 다루기(Object Destructuring, Object.freeze)
Clean Code JS 강좌는 여러 절로 구성되어 있습니다.
- 클린코드 자바스크립트 1-1 변수 다루기(let & const 사용, function scope & block scope)
- 클린코드 자바스크립트 1-2 변수 다루기(전역 공간 사용 최소화,임시 변수 제거하기)
- 클린코드 자바스크립트 1-3 변수 다루기(호이스팅)
- 클린코드 자바스크립트 2-1 타입 다루기(타입 검사)
- 클린코드 자바스크립트 2-2 타입 다루기(undefined & null, eqeq 줄이기)
- 클린코드 자바스크립트 2-3 타입 다루기(형변환 주의하기, isNaN)
- 클린코드 자바스크립트 3-1 경계 다루기(min-max,begin-end,first-last,접두사와 접미사, 매개변수 순서가 경계)
- 클린코드 자바스크립트 4-1 분기 다루기(값식문, 삼항 연산자)
- 클린코드 자바스크립트 4-2 분기 다루기(truthy & falsy, 단락 회로 평가)
- 클린코드 자바스크립트 4-3 분기 다루기(else if & else 피하기, Early Return, Default case 고려하기)
- 클린코드 자바스크립트 4-4 분기 다루기(Default case 고려하기, Nullish coalescing operator, 드모르간 법칙)
- 클린코드 자바스크립트 5-1 배열 다루기(JS의 배열은 객체다, Array.length, 배열 요소에 접근하기)
- 클린코드 자바스크립트 5-2 배열 다루기(유사 배열 객체, 불변성, for문 배열 고차 함수로 리팩토링)
- 클린코드 자바스크립트 5-3 배열 다루기(배열 메소드 체이닝 활용, map vs forEach, continue&break)
- 클린코드 자바스크립트 6-1 객체 다루기(Object Destructuring, Object.freeze)
- 클린코드 자바스크립트 6-2 객체 다루기(Prototype 조작 지양하기, hasOwnProperty, 직접 접근 지양하기)
- 클린코드 자바스크립트 7-1 함수 다루기([함수,메서드,생성자], argument & parameter,복잡한 인자 관리하기)
- 클린코드 자바스크립트 7-2 함수 다루기(default value, Rest Parameters, void & return, 화살표 함수)
- 클린코드 자바스크립트 7-3 함수 다루기(Callback Function, 순수 함수, Closure)
객체 다루기 😎
Object Destructuring👍
function Person(name, age, location) {
this.name = name;
this.age = age;
this.location = location;
}
const john = new Perosn("john", 30, "Korea");
function Person({ name, age, location }) {
this.name = name;
this.age = age ?? 30;
this.location = location ?? "korea";
}
const john = new Perosn({
name: "john",
age: 30,
location: "Korea",
});
// name이 필수일 경우
// 명시적 표현 가능
function Person(name, { age, location }) {
this.name = name;
this.age = age ?? 30;
this.location = location ?? "korea";
}
const johnOptions = {
age: 30,
location: "Korea",
};
const john = new Perosn("poco", johnOptions);
const orders = ["First", "Second", "Third"];
const st = orders[0];
const rd = orders[2];
console.log(st);
console.log(rd);
const [first, , third] = orders;
console.log(first);
console.log(third);
// 생각보다 이런 경우가 많음
const { 0: st2, 2: rd2 } = orders;
console.log(st2);
console.log(rd2);
- Ex) React 경우
function Welcome(props) {
return <h1>Hello {props.name} </h1>;
}
// 객체 구조 분해 할당
function Welcome2({ name }) {
return <h1>Hello {name} </h1>;
}
Object.freeze👍
const STATUS = Object.freeze({
PENDING: "PENDING",
SUCCESS: "SUCCESS",
FAIL: "FAIL",
});
STATUS.NEW_PROP = "P2";
console.log(STATUS); // PENDING: "PENDING",SUCCESS: "SUCCESS",FAIL: "FAIL"
Object.isFrozen(STATUS); // true
Object.isFrozen(STATUS.PENDING); // true
Object.isFrozen(STATUS.FAIL); // true
shallow copy vs deep copy
- 깊은 복사에는 관여를 못한다.
const STATUS = Object.freeze({
PENDING: "PENDING",
SUCCESS: "SUCCESS",
FAIL: "FAIL",
OPTION: {
GREEN: "GREEN",
RED: "RED",
},
});
STATUS.OPTIONS.GREEN = "G";
STATUS.OPTIONS.YELLOW = "Y";
console.log(STATUS.OPTIONS); // GREEN: "GREEN", RED: "RED", YELLOW:"Y"
Object.isFrozen(STATUS.OPTIONS.GREEN); // false Deep Freezing 이 되지 않는다.
중첩된 Freezing 해결 방법🌼
- 대중적인 유틸 라이브러리(lodash)
- 직접 유틸 함수 생성
- stackoverflow
- TypeScript
function deepFreeze(targetObj) {
// 1. 객체를 순회
// 2. 값이 객체인지 확인
// 3. 객체이면 재쉬
// 4. 그렇지 않으면 Object.freeze
Object.keys(targetObj).forEach(key => {
if(/*객체가 맞다면*/) {
deepFreeze();
}
})
return Object.freeze(targetObj);
}