From 618961418a0a3b1a9057beee1d475450d16b1713 Mon Sep 17 00:00:00 2001 From: GeunYeong Kim <97326130+root-zero-o@users.noreply.github.com> Date: Mon, 4 Mar 2024 22:15:22 +0900 Subject: [PATCH] feat : 2024-03-04 (root-zero-o) --- docs/root-zero-o/DIL/2024-03-04.md | 126 +++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 docs/root-zero-o/DIL/2024-03-04.md diff --git a/docs/root-zero-o/DIL/2024-03-04.md b/docs/root-zero-o/DIL/2024-03-04.md new file mode 100644 index 0000000..4d23017 --- /dev/null +++ b/docs/root-zero-o/DIL/2024-03-04.md @@ -0,0 +1,126 @@ +### 2024-03-04 +- 공부 범위 : 1.1 동등비교 ~ 1.2 함수 +- 공부 시간 : 퇴근 후 20:00 ~ 22:00 +> 간접적으로 얕은 비교라고만 알고 있던 의존성 배열에서 내부적으로 shallowEqual을 사용해 Object.is 와 순환을 통해 비교한다는 점이 재밌었습니다. + + +
+
+ + + +# 1. 리액트 개발을 위해 꼭 알아야 할 자바스크립트 + + +## 1.1 자바스크립트의 동등비교 + +### 자바스크립트의 데이터 타입 + +- 원시 타입(primitive type) + + - undefined : 선언되었지만 할당되지 않은 값 + - null : 명시적으로 비어 있음을 나타내는 값. ```typeof``` 로 확인하면 object가 리턴된다. + - boolean : true, false 만을 가질 수 있는 데이터 타입 + - number : 정수, 실수 구분 없는 숫자 + - bigInt : number의 한계를 넘어 더 큰 숫자를 저장할 수 있게 해준다. 끝에 n을 붙이거나 ```BigInt``` 함수를 사용한다. + - string : 텍스트 타입의 데이터 + - symbol : 중복되지 않는 고유한 값을 만들기 위해 사용한다. ```Symbol()```로 생성한다. + +- 객체 타입(reference type) + + - 7가지 원시 타입 이외의 모든 것 + + - 특징 + - 원시 타입은 불변 형태의 값으로 저장 / 객체 타입은 변경 가능한 형태로 저장 + - 원시 타입은 값을 복사 / 객체 타입은 값이 아닌 참조를 전달 + +### Object.is + +- 인수 두 개가 동일한지 확인하고 반환하는 메서드 +- 형변환을 하지 않는다. +- ```===``` 로 정확히 비교할 수 없는 특이한 케이스를 비교할 수 있다. (예: ```-0 === +0``` 은 true, ```object.is```는 false 반환) +- 객체 비교는 동일하다. + +### 리액트에서의 동등비교 +- 리액트에서는 ```Object.is```를 사용한다. +- ShallowEqual : ```Object.is```를 사용해 한 번 비교한 뒤, 순회를 통해 1 depth까지 비교한다. +```javascript +function shallowEqual(objA: mixed, objB: mixed){ + if(is(objA, objB)){ + return true + } + if(typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null){ + return false + } + + // 얕은 비교 한 번 더 수행 + const keysA = Object.keys(objA) + const keysB = Object.keys(objB) + + if(keysA.length !== keysB.length){ + return false + } + + for(let i = 0; i < keysA.length; i++){ + const currentKey = keysA[i] + if(!hasOwnProperty.call(objB, currentKey) || !is(objA[currentKey], objB[currentKey])){ + return false + } + } + return true +} +``` +- JSX props는 객체 -> props 값을 얕은 비교하여 값이 변했을 때 렌더링 수행 +- 리액트는 얕은 비교까지만 구현 -> props에 더 깊은 객체를 넣으면 memo가 제대로 동작하지 않는다 + +--- + +
+ +## 1.2 함수 + +### 함수란? +- 작업을 수행하거나 값을 계산하는 드의 과정을 표현하고, 이를 하나의 블록으로 감싸 실행 단위로 만들어 놓은 것 + +- 함수 선언문 + - 함수 호이스팅이 일어난다. +```javascript +function add (a,b){ + return a + b; +} +``` + +- 함수 표현식 + - 할당하려는 함수의 이름을 생략한다. + - 함수를 변수에 할당하기 때문에 변수 호이스팅이 일어나 런타임 이전에 undefined로 초기화되고, 런타임에 함수가 할당된다. + +- Function 생성자 + - 권장되지 않는다. + +- 화살표 함수 + - constructor를 사용할 수 없다. 따라서 생성자 함수로 사용할 수 없다. + - arguments가 존재하지 않는다. + - 함수 자체의 바인딩을 갖지 않는다. 따라서 this를 참조하면 상위 스코프의 this를 그대로 따른다. + +- 즉시 실행 함수(IIFE) + - 함수를 정의하고 그 순간 즉시 실행되는 함수 + - 단 한 번만 호출되고 다시 호출할 수 없다. -> 이름을 붙이지 않는다. + +- 고차 함수 + - 함수를 인수로 받거나 결과로 새로운 함수를 반환하는 역할을 하는 함수 + +### 함수를 만들 때 주의해야 할 사항 + +1. 함수의 부수효과를 최대한 억제한다.(순수함수) + + - 부수 효과가 없고, 동일한 인수를 받으면 동일한 결과를 반환해야 한다. + - 작동 중 외부에 어떠한 영향도 미쳐서는 안된다. + - 리액트 : 부수 효과를 처리하는 훅인 ```useEffect```의 작동을 최소화하여 컴포넌트 안정성을 높인다. + +2. 가능한 한 함수를 작게 만든다. + +3. 누구나 이해할 수 있는 이름을 붙인다. + +--- + +