이 글은 [모던 JavaScript 튜토리얼]을 공부하며 정리한 글입니다.

 

 

👉 기본 환경

- Language: JavaScript

- IDE: VS code

 

 


4. 변수와 상수

 

변수 규칙

- 숫자와 문자를 사용하되 첫 글자는 숫자가 될 수 없음

- 특수기호는 $와 _만 사용할 수 있음

 

⭐ 변수명 짓기

1
2
3
4
5
6
// 우리가 살고 있는 행성
let ourPlanetName = "Earth";
 
// 현재 접속중인 방문자 이름
let currentUserName = "John";
 
 

* planet이라는 단순한 이름보다는 어떤 행성의 이름인지를 설명하는 것이 중요

* userName이라는 단순한 이름보다는 현재 접속중인이라는 상태를 설명하는 것이 중요

 

1
2
3
4
5
6
// 대문자 상수: 기억하기 어려운 하드 코딩한 값의 별칭을 만들 때 주로 사용
const BIRTHDAY = '18.04.1982';
 
// 일반 상수: 런타임 과정에서 계산되지만 최초 할당 이후 값이 변하지 않을 때 주로 사용
const age = calculateAge(birthday);
 
 

* 대문자 상수는 상수 중에서도 실행과 무관하게 변경되지 않는 값에 사용

* 일반 상수는 런타임 이후 변경되지 않는 값에 사용

 

 


5. 자료형

 

* null

    - ‘존재하지 않는(nothing)’ 값, ‘비어 있는(empty)’ 값, ‘알 수 없는(unknown)’ 값

    - typeof null의 = "object"
    - null은 별도의 고유한 자료형을 가지는 특수 값으로 객체가 아니지만, 하위 호환성을 유지하기 위해 이런 오류를 수정하지 않고 남겨둔 상황

    - Number(null) = 0;

* undefined

    - 변수는 선언했지만, 값을 할당되지 않은 상태

    - Number(undefined) = NaN;

* typeof

    -  인수의 자료형을 반환

 

⭐ 단, 내부 규칙에 의하여

    - null == undefined (true)

    - null === undefined (false)

 

 


6. alert, prompt, confirm을 이용한 상호작용

 

* alert

    - alert();

    - 사용자가 ‘확인(OK)’ 버튼을 누를 때까지 메시지를 보여주는 창이 계속 떠있음

* prompt

    - prompt(텍스트 메세지, [입력 필드의 초깃값]);

    - 텍스트 메시지와 입력 필드(input field), 확인(OK) 및 취소(Cancel) 버튼이 있는 모달 창 발생

* confirm

    - confirm();

    - 사용자가 확인 또는 취소 버튼을 누를 때까지 메시지가 창에 보여짐, 사용자가 확인 버튼을 누르면 true / 취소 버튼이나 Esc를 누르면 false 반환

 

 


8. 기본 연산자와 수학

 

1
2
3
let cal1 = 2 + 2 + '1' // 41
let cal2 = '1' + 2 + 2 // 122
 
 

* + 연산자

    - 피연산자 중 어느 하나가 문자열이면 다른 하나도 문자열로 변환

        - 다른 연산자의 경우, 문자열을 숫자로 바꾼 후 연산

    - 단항 연산자로 사용 시, 피연산자가 숫자가 아닌 경우엔 숫자형으로 변환

* + 연산자 이 외 연산자

    - 문자열이 숫자형으로 변할 땐 공백을 만드는 문자 \t와 \n, 일반적인 공백 제거

 

⭐ 코드 한 줄엔, 특정 동작 하나에 관련된 내용만 작성하는 게 좋음

 

 


9. 비교 연산자

 

* === 일치 연산자

    - 자료형의 동등 여부까지 검사

    - switch문은 조건을 확인할 때 내부적으로 일치 연산자 ===를 사용해 비교

* == 동등 연산자, < > <= >= 기타 연산자

1
2
3
4
5
6
7
8
9
10
11
12
// null
alertnull > 0 );  // (1) false
alertnull == 0 ); // (2) false
alertnull >= 0 ); // (3) true
// undefined
alertundefined > 0 ); // false (1)
alertundefined < 0 ); // false (2)
alertundefined == 0 ); // false (3)
// null & undefined
alertnull === undefined ); // false
alertnull == undefined ); // true
 
 

- null과 undefined를 == 연산자로 비교하면 true를 반환하지만, 다른 값과 비교하면 무조건 false를 반환

 

* 사전순 비교 유의

1
2
3
2 > 12// false
"2" > "12" // true("2"와 "1"을 비교)
 
 

- 크고 작음을 비교하는 연산자의 피연산자로 문자열이 들어오면 글자 단위로 크기 비교가 이뤄짐

 

⭐ 만약 변수가 undefined나 null이 될 가능성이 있다고 판단되면, 이를 확인하여 따로 처리하는 코드를 추가

 

 


11. 논리연산자

 

* ||

    - 첫 번째 truthy를 찾는 OR 연산자

        - 각 피연산자를 불린형으로 변환 → 변환 후 값이 true이면 연산을 멈춤 → 해당 피연산자의 변환 전 원래 값을 반환

        - 피연산자에 truthy가 하나도 없다면 마지막 피연산자를 반환

        - 옵션값과 Default 값에서 사용

* &&

    - 첫 번째 falsy를 찾는 AND 연산자

 

⭐ AND 연산자 &&의 우선순위는 OR 연산자 ||보다 높음

if를 ||나 &&로 대체 X

 

1
2
alertalert(1|| 2 || alert(3) );
 
 

* 첫 번째 얼럿 창에 1이 출력

→ alert()은 undefined를 반환: falsy

→ 2는 truthy이기 때문에 실행이 멈추고 2가 반환

 

1
2
alertnull || 2 && 3 || 4 );
 
 

* 2 && 3 = 3

→ null || 3 || 4

→ 3

 

1
2
if (null || -1 && 1alert'third' );
 
 

* -1 && 1

→ null || 1

→ 1

 

 


12. nullish 병합 연산자 '??'

 

* ??

    - 정확하게 null이나 undefined일 경우에만 false (0 제외)
    - ⭐ &&나 ||와 함께 사용하지 못함(단, 괄호 사용 시, 사용 가능)

 

1
2
3
// height가 null이나 undefined인 경우, 100을 할당
height = height ?? 100;
 
 

??는 변수에 기본값을 할당하는 용도로 사용할 수 있음

 

 


13. ‘while’ 반복문

 

⭐ ‘?’ 오른쪽엔 break나 continue가 올 수 없음

 

1
2
3
for (let i = 0; i < 5++i) alert( i );
for (let i = 0; i < 5; i++alert( i );
 
 

두 경우 모두 0부터 4까지 출력

 

1
2
3
4
5
6
let num;
do{
    num = prompt("Enter the number"0);
}
while(num<=100 && num)
 
 

num이 null이거나 undefined일 경우, 숫자로 형변환하면 0이 되므로 falsy를 판단하는 추가적 조건문 필요

 

 


15. 함수

 

1
2
3
4
5
6
7
let from = 'Ann';
function showMessage(from, text = "no text given") {
  alertfrom + ": " + text );
}
 
showMessage("Ann"); // Ann: no text given
 
 

* 매개변수에 인자를 넘겨주지 않을 경우, undefined 출력

default값 설정을 위해 대입 연산자 활용

 

1
2
3
4
5
6
7
8
9
function doNothing() { /* empty */ }
alert( doNothing() === undefined ); // true
 
 
function doNothing() {
  return;
}
alert( doNothing() === undefined ); // true
 
 

* return문이 없거나 return 지시자만 있는 함수는 undefined를 반환

 

1
2
3
return
 (some + long + expression + or + whatever * f(a) + f(b))
 
 

⭐ return 부분을 개행할 경우, return; 처리되는 것에 유의

만일 개행이 필요할 경우, () 활용

1
2
3
4
5
6
return (
  some + long + expression
  + or +
  whatever * f(a) + f(b)
  )
 
 

 

 


16.  함수 표현식

 

1
2
3
4
5
6
function sayHi() {   // (1) 함수 생성
  alert"Hello" );
}
 
let func = sayHi;    // (2) 함수 복사
 
 

* sayHi 다음에 괄호가 없음에 유의
    - 괄호가 있었다면 func = sayHi() 가 되어 sayHi 함수 그 자체가 아니라, 함수 호출 결과(함수의 반환 값) 가 func에 저장

 

1
2
3
4
5
6
sayHi("John"); // Hello, John
 
function sayHi(name) {
  alert( `Hello, ${name}` );
}
 
 

함수 선언문, sayHi는 스크립트 실행 준비 단계에서 생성되기 때문에, 스크립트 내 어디에서든 접근할 수 있음

 

1
2
3
4
5
6
sayHi("John"); // error!
 
let sayHi = function(name) {  // (*) 마술은 일어나지 않습니다.
  alert( `Hello, ${name}` );
};
 
 

함수 표현식은 실행 흐름이 표현식에 다다랐을 때 만들어짐

 

⭐ 함수를 선언해야 한다면 함수가 선언되기 이전에도 함수를 활용할 수 있는 함수 선언문 방식을 따르는 게 좋음
    - 함수 선언 방식은 코드를 유연하게 구성할 수 있도록 해주고, 가독성도 좋음

 

 


17. 화살표 함수 기본

 

- 본문이 한 줄인 함수를 작성할 때 유용

- 본문이 여러 줄로 구성되었다면 중괄호를 사용

    * 이 경우, 반드시 return 지시자를 사용해 반환 값을 명기

 

⚛️ 기본 환경: IDE: VS code, Language: React

 

 

발생 Error

React에서 다음 Source Code를 실행할 경우,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import React from "react";
import { Navigate } from "react-router-dom";
 
const TempComp = (props) => {
    const tempHandler = () => {
        Navigate("/TempPage");
    };
    return (
        <div>
            <button onClick={tempHandler}>
                <span>Button</span>
            </button>
        </div>
    );
};
 
export default TempComp;
 
 
 

🚨 다음과 같은 오류 발생

Invalid hook call.

Hooks can only be called inside of the body of a function component.

This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app

 

 

발생 원인

⭐ Navigate Hook은 컴포넌트의 함수 본문 내(return 안)에서 사용해야하지만, 함수 본문 외(return 밖)에서 실행

 

 

해결 방법

onClick 함수에서 tempHandler를 함수형으로 직접 선언

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import React from "react";
import { Navigate } from "react-router-dom";
 
const TempComp = (props) => {
    const TempHandler = () => {
        Navigate("/TempPage");
    };
    return (
        <div>
            <button onClick={() => {TempHandler();}}>
                <span>Button</span>
            </button>
        </div>
    );
};
 
export default TempComp;
 
 
 

 

⚛️ 기본 환경: IDE: VS code, Language: React

 

 

useEffect()

: 리액트 컴포넌트가 렌더링 될 때마다 특정 작업을 실행할 수 있도록 하는 Hook

 

useRef()

: React 컴포넌트에서 변수를 저장하고 관리하는 데 사용하는 도구

: 컴포넌트의 렌더링과 관련된 값의 변경에 영향을 받지 않음

 

 

useEffect() 내부에서 useState를 활용한 setState를 할 경우,

1. mount될 때 1번

2. state변경될 때 1번

총 2번(mount 1번 + 렌더링 1번)의 useEffect가 호출됨

 

이 때, Ref를 선언하고 isEffectedRef.current를 활용하여 변수의 현재 값을 가져와 false일 때만 useEffect가 실행되도록 제어할 수 있음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const isEffectedRef = useRef(false);
 
useEffect(() => {
    const effedtedFunc = () => {
    try {
        setData(data);
      } catch (error) {
        console.error(error);
      }
    };
 
    if (!isEffectedRef.current) {
      effedtedFunc();
      isEffectedRef.current = true;
      // setData의 영향을 받지 않아 1번만 effedtedFunc가 실행될 수 있도록 함
      // 이후에는 데이터가 변경되었으므로 더이상 setData에 따른 rendering이 일어나지 않음
 
    }
  }, []);
 
 
 

 

🟨 기본 환경: IDE: VS code, Language: JavaScript

 

 

발생 Error

JavaScript에서 다음 Source Code를 실행할 경우,

1
2
 props.forEach(console.log(props.movieImg.length));
 
 
 

🚨 다음과 같은 Error 발생

props.forEach is not a function
TypeError: props.forEach is not a function

 

 

발생 원인

forEach()의 매개변수를 함수가 아닌 배열의 개별 인자를 전달

 

 

해결 방법

콜백 함수를 사용하여 배열의 각 요소를 반복 처리

1
2
3
4
  props.forEach((data) => {
    console.log(data.movieImg.length);
  });
 
 
 

* callback 함수: 다른 함수에게 전달되는 함수

: 나중에 호출되며, 일반적으로 다른 함수의 동작을 지정하거나 완료된 후에 실행되는 코드를 정의하는 데 사용

 

⚛️ 기본 환경: IDE: VS code, Language: React

 

 

발생 Error

React에서 다음 Source Code를 실행할 경우,

1
2
3
4
5
6
7
8
9
10
  function addMovieHandler(movie) {
    const response = await fetch('https://react-http-e9810-default-rtdb.firebaseio.com/movies.json', {
      method: 'POSt',
      body: JSON.stringify(movie),
      headers: {
        'Content-Type''application/json'
      }
    });
  }
 
 
 

🚨 다음과 같은 오류 발생

'await' expressions are only allowed within async functions and at the top levels of modules.

 

 

발생 원인

'await': 프로미스가 해결(resolve)될 때까지 기다리는 역할 = 데이터를 전달받을 때까지 기다리는 역할
🚨 비동기 함수(async function) 안에서만 사용되어야 하며, 함수 외부에서 사용하려면 비동기 함수를 호출해야함

 

 

해결 방법

비동기 함수 선언: async function

1
2
3
4
5
6
7
8
9
10
  async function addMovieHandler(movie) {
    const response = await fetch('https://react-http-e9810-default-rtdb.firebaseio.com/movies.json', {
      method: 'POSt',
      body: JSON.stringify(movie),
      headers: {
        'Content-Type''application/json'
      }
    });
  }