자바스크립트 스터디 1주차(22/11/28~22/12/05)
📖 목차
4장 변수
💡 변수란?
⇒ 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위한 이름이다.
⇒ 연산을 통해 생성된 값이 메모리 공간에 저장되면, 해당 값을 다시 읽기위한 이름
⇒ 메모리 주소에 직접 저장하고 참조하지 않게 하기 위함
- 변수 선언 키워드 ⇒ var: 함수 레벨 스코프를 지원하여, 의도치 않게 전역 변수가 선언될 수 있다. (호이스팅 발생함) ⇒ let, const: 블록 레벨 스코프를 지원함, 호이스팅이 잘 안발생한다. (발생할 수는 있다.)
- 변수 선언은 선언 단계와 초기화 단계 두 단계로 이루어진다.
- 변수를 선언하면 변수 이름(식별자)를 등록하고 저장할 메모리 공간을 확보한다.
- var의 경우 undefined로 암묵적으로 할당되어 초기화된다.
- 호이스팅 ⇒ 호이스팅: 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 것 ⇒ 자바스크립트는 평과과정과 실행과정이 있다. ⇒ 평과과정에서 모든 선언문을 다 실행시킨다. ⇒ 이후, 실행과정에서 나머지 코드들을 순차적으로 실행시킨다. ⇒ 이때, var의 경우 위에서 적은 것과 같이 undefined로 암묵적으로 할당되어 초기화 된다. ⇒ 따라서, 해당 var 식별자의 재할당 코드가 나오지 않고, 그 전에 사용이 되면 호이스팅이 발생한다.
🔎 헷갈릴 만한 것들 (단어 정리)
- var result = 30; 이라는 표현식이 있을 때, 각 구간을 나누어 보자. ⇒ 변수 선언 키워드 : var (let, const도 있음) ⇒ 변수 이름 (식별자): result ⇒ 변수 값: 30
- 선언: 변수를 저장하기 위한 메모리를 확보하고, 변수 이름과 해당 메모리 공간을 연결하는 것
- 할당(대입): 변수에 값을 저장하는 것
- 참조: 변수에 저장된 값을 읽어들이는 것
- 초기화: 변수가 선언된 이후 최초로 값을 할당하는 것
- 평가: 식(표현식)을 계산하는 것 (ex ⇒ 식이 평가되면 값이 된다.)
5장 표현식과 문
- 값 ⇒ 식(표현식)이 평가되어 생성된 결과 ⇒ 변수는 하나의 값 을 저장하기 위한 것이므로 변수에 할당되는 것은 값이다.
- 리터럴 ⇒ 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법 ⇒ 리터럴은 정수, 부동소수점, 문자열, 불리언 등등 많이 있다.
- 표현식 ⇒ 값으로 평가될 수 있는 문이다. ⇒ 표현식이 평가되면, 값을 생성하거나 기존 값을 참조한다. ⇒ 표현식은 값처럼 사용할 수도 있다.
- 문 ⇒ 프로그램을 구성하는 기본 단위이자 최소 실행 단위이다. ⇒ 선언문, 할당문, 조건문, 반복문 등으로 구분
🔎 헷갈릴 만한 것들
- 표현식인 문과 표현식이 아닌 문? ⇒ 표현식과 문이 비슷해서 구별하기 어려운데 어떻게 구별해야 하나? 변수에 할당해보기 ⇒ 즉, 값으로 사용할 수 있으면 표현식인 문이고, 값으로 사용하지 못하면 표현식이 아닌 문이다. ⇒ 표현식인 문을 실행하면 평가된 값 반환, 표현식이 아닌 문을 실행하면 undefined 반환
6장 데이터 타입
- 원시타입 1. 숫자타입 ⇒ 배정밀도 64비트 부정 소수점 형식의 2진수로 저장 (Infinity, -Inifinity, NaN 기억하기) 2. 문자열 타입 ⇒ 백틱을 사용한 템플릿 리터럴 기억 3. 불리언 타입 4. undefined 타입 5. null 타입 6. 심벌 타입
- 객체 타입 - 객체, 함수, 배열
- 데이터 타입이 필요한 이유 - 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해 - 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해 - 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해
- 동적 타이핑 - 자바스크립트는 선언이 아닌 할당에 의해 타입이 결정되는 동적 타입 언어 이다.
7장 연산자
- 산술 연산자
- 할당 연산자
- 비교 연산자 (NaN 조심 ⇒ isNaN 으로 검사해야 함, 0 === -0 true도 조심)
- 삼항 연산자 (많이 쓰임) ⇒ 삼항 연산자의 표현식에는 값으로 평가할 수 있는 표현식인 문을 써야한다.
- 논리 연산자
- 그 외 연산자들 (쉼표 연산자, 그룹 연산자, typeof 연산자(타입체크), 지수 연산자(**제곱))
** 다른 것들은 뒤에 출현 !
⇒ 연산자 우선순위는 다 기억하기 어려우니 그룹 연산자로 우선순위를 명시적으로 조절하자!
8장 제어문
- 제어문: 조건에 따라 블록 실행하거나, 반복 실행 때 사용
- 조건문 : if…else, switch(표현식에 따른 결과(==조건)가 많으면 switch를 쓰는게 가독성이 좋다.)
- 반복문: for, while, do..while ⇒ break문: 블록을 탈출시킨다. (forEach와 같은 구문에선 작동하지 않아서 return false; 등을 쓴다.) ⇒ for…of문: 배열이나 iterable 순회 가능(배열, Map([key, value]), Set, String 등)
9장 타입변환과 단축 평가
- 명시적 타입 변환(타입 캐스팅) ⇒ 표준 빌트인 생성자 함수를 new 연산자 없이 호출하는 방법 ⇒ 빌트인 메서드를 사용하는 방법 (toString, parseInt, parseFloat) ⇒ 암묵적 타입 변환을 이용하는 방법 ** 불리언 타입에서는 !! (부정 논리 연산자 두번)으로 명시적 변환 가능
- 암묵적 타입 변환(타입 강제 변환) ⇒ + 연산자는 피 연산자 중 하나 이상이 문자열이면 문자열 연결 연산자로 동작 ⇒ 0 + ‘’, true + ‘’ 등으로 암묵적 변환 사용 (문자열 타입으로 변환) ⇒ + 단항 연산자가 앞에 붙거나, +가 아닌 산술 연산자, 비교 연산자는 숫자 타입으로 암묵적 타입 변환을 수행한다. ⇒ if 문, for문과 같은 제어문 이나 삼항 조건 연산자의 조건식은 불리언 값으로 암묵적 타입 변환을 수행
‼️ 두 개 모두 기존 원시값을 직접 변경하는 것은 아니다.
⇒ 타입 변환이란 기존 원시 값을 사용해 다른 타입의 새로운 원시값을 생성하는 것이다.
🔎 헷갈릴 만한 개념
- 단축평가
⇒ 논리합( || ) 이나 논리곱( && )연산자 표현식은 언제나 두개의 피 연산자 중 어느 한쪽으로 평가된다.

- 예제 1
- 예제 2
- 예제 3
10장 객체 리터럴
- 객체 ⇒ 자바스크립트를 구성하는 거의 모든것 (원시값을 제외한 나머지 값 모두) ⇒ 원시 값은 변경 불가능한 값(불변성)이지만, 객체는 변경 가능한 값이다. ⇒ 프로퍼티와 메서드로 구성된다.
- 객체 생성 방법
- 프로퍼티 ⇒ 프로퍼티는 키와 값으로 구성된다. ⇒ 키값은 식별자와 같은 역할을 하나, 식별자 네이밍 규칙을 따르는 것은 아니다. 허나 따르지 않으면, 따옴표로 감싸주어야 한다! ⇒ 키 값에 문자열이나 심벌 값 이외의 값을 쓰면, 암묵적으로 문자열 타입으로 변환한다. ⇒ 같은 키로 생성된 프로퍼티는 나중에 선언한 프로퍼티로 덮어씌어진다.
- 프로퍼티 접근: 마침표 표기법이나 대괄호 표기법
- 프로퍼티 축약 표현 (ES6 추가)
- 메서드 축약 표현 (ES6 추가)
🤔 원시값은 왜 변경 불가능한 값일까?
⇒ 변수에 원시값을 할당하면 해당 값이 메모리에 들어가는데, 새로운 값을 할당하면 원래 있던 값을 변경하는 것이 아닌, 새로운 메모리에 새로운 값을 넣기 때문에 값이 변경 불가능하다고 한다!
11장 원시값과 객체의 비교
- 원시타입과 객체 타입의 차이점 1) 원시값은 변경 불가능한 값, 객체 타입은 변경 가능한 값 2) 원시값을 변수에 할당하면 확보된 메모리 공간에는 실제 값 저장, 객체 타입은 메모리 공간에 참조값 저장 3) 원시값을 갖는 변수를 다른 변수에 할당하면 원본의 원시 값이 복사되어 전달된다. (값에 의한 전달) ↔ 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달된다. (참조에 의한 전달)
💡 값에 의한 전달과 참조에 의한 전달
12장 함수
- 함수란? ⇒ 일련의 과정을 문으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것 ⇒ 매개변수: 함수 내부로 입력을 전달받기 위한 변수 ⇒ 인수: 해당 변수에 입력한 값 ⇒ 반환값: return으로 반환되는 함수의 결과값
- 함수를 사용하는 이유? 유지보수 편의성, 재사용성, 코드의 신뢰성, 가독성 높임
- 함수 리터럴 ⇒ 함수는 객체 타입의 값이므로 리터럴로 생성 가능 ⇒ 일반 객체와 차이점: 일반 객체는 호출할 수 없지만, 함수는 호출할 수 있다.
- 함수 정의 1) 함수 선언문 ⇒ 함수 이름 생략 불가, 표현식이 아닌 문(변수에 할당 불가) ⇒ 하지만, 변수에 할당 되는 것 처럼 보인다. (리터럴 표현식으로 해석될 수 있다.) ⇒ 기명 함수 리터럴 표현식과 함수 선언문의 차이: 함수 외부에서 호출할 수 있으면 함수 선언문, 함수 외부에서 호출할 수 없다면 기명 함수 리터럴 표현식이다. ⇒ 함수 선언문으로 작성한 함수는 선언문 이전에 호출이 가능하다. (생성시점이 런타임 이전이기 때문) ⇒ 그러므로 함수 호이스팅이 발생할 수 있다! 2) 함수 표현식 ⇒ 함수 표현식으로 작성한 함수는 선언문 이전에 호출이 불가능하다. (런타임에 평가되기 때문) ⇒ 함수 표현식으로 함수를 정의하면 변수 호이스팅이 발생한다. 3) Function 생성자 함수 ⇒ 클로저를 생성하지 않는다. 4) 화살표 함수 ⇒ 익명함수로 정의한다. ⇒ 기존 함수와 this 바인딩이 다르다.
- 함수 호출 - 매개변수와 인수 ⇒ 자바스크립트 함수는 매개변수와 인수의 개수가 일치하는지 확인 안함, 동적으로 타입 지정함
- 여러가지 함수 종류 - 즉시 실행 함수, 재귀함수, 중첩함수(클로저), 콜백 함수,
🔎 헷갈릴 만한 것들 (용어 정리)
1. 자바스크립트에서 함수 선언문을 해석해 함수 객체를 생성했을 때, 함수이름은 함수 몸체 내부에서만 유효한 식별자인데 어떻게 함수 외부에서 사용이 가능할까?
⇒ 외부에서 사용이 가능하려면 함수 이름과는 별도로 생성된 함수객체를 기리키는 식별자가 필요하다.
⇒ 식별자가 없으면 함수 객체를 참조할 수 없으므로 호출할 수도 없기 때문이다.
⇒ 자바스크립트 엔진은 생성된 함수를 호출하기 위해 암묵적으로 함수이름과 동일한 이름의 식별자를 생성함
⇒ 생성한 식별자에 함수 객체를 할당한다.
** 함수는 함수 이름으로 호출하는 것이 아닌 함수 객체를 가리키는 식별자로 호출한다
2. 일급 객체
⇒ 값의 성질을 갖는 객체를 일급 객체라고 한다. 자바스크립트의 함수는 일급 객체이다.
3. 매개변수의 최대 개수
⇒ 이상적인 매개변수 개수는 0개이며(3개 이하), 이상적인 함수는 한가지 일만 해야하며 가급적 작게 만든다.
4. 고차함수
⇒ 매개변수를 통해 콜백함수를 전달받은 함수를 고차함수라고 한다.
5. 순수함수와 비순수함수
⇒ 순수함수: 동일한 인수가 전달되면 언제나 동일한 값을 반환하는 함수다. (외부 상태에 의존하지도 않고, 변경하지도 않는 부수효과가 없는 함수)
⇒ 비순수함수: 외부 상태에 따라 반환값이 달라지는 함수다. (외부 상태에 의존하거나 외부 상태를 변경하는 부수효과가 있는 함수)
⇒ 매개변수로 객체를 전달받으면 비순수 함수가 된다. (값의 변경이 가능하므로)
13장 스코프
- 스코프란? ⇒ 모든 식별자가 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효범위가 결정되는 것 (식별자가 유효한 범위, 식별자를 검색할 때 사용하는 규칙) ⇒ 자바스크립트 엔진은 스코프 체인을 통해 어떤 변수를 참조해야할 것인지 결정한다.
- 스코프 체인 ⇒ 모든 스코프가 계층적으로 연결된 것 ⇒ 예를 들어 x라는 변수를 찾으려고 할때, 찾으려고 하는 블록의 지역 스코프 부터 전역 스코프까지 순차적으로 찾고, 찾으면 검색을 끝낸다.
🔎 헷갈릴 만한 것들
1. 함수 레벨 스코프와 블록 레벨 스코프
⇒ var 키워드로 생성된 변수는 오로지 함수의 코드 블록만을 지역 스코프로 인정
⇒ let, const 키워드로 생성된 변수는 모든 코드 블록을 지역 스코프로 인정
2. 렉시컬 스코프
⇒ 자바스크립트는 함수를 어디서 정의했는지에 따라 상위 스코프를 결정하는 렉시컬 스코프를 따른다.
⇒ 함수의 상위 스코프는 함수가 정의될 때 정적으로 결정된다. 그리고, 함수 정의가 실행되어 생성된 함수 객체는 이렇게 결정된 상위 스코프를 기억한다.
14장 전역변수의 문제점
- 지역 변수의 생명 주기 ⇒ 대부분 함수의 생명 주기와 일치하지만 지역 변수가 함수보다 오래 생존하는 경우도 있다.(클로저)
- 전역 변수의 생명주기 ⇒ 더 이상 실행할 문이 없을 때 종료 ⇒ var 키워드로 선언한 전역 변수와 생명주기가 일치한다.
- 문제점 ⇒ 모두가 전역 변수를 참조하고 변경할 수 잇는 암묵적 결합을 허용하는 문제점 ⇒ 생명주기가 길다 (리소스도 오랜 기간 소비, 변수의 상태를 변경할 수 있는 기간이 길다) ⇒ 스코프 체인 상에서 종점에 존재해서 검색 속도가 느리다 ⇒ 네임 스페이스를 오염시킬 수 있다.
- 해결책 1. 즉시 실행 함수: 모든 코드를 즉시 실행 함수로 감싸면 모든 변수가 즉시 실행 함수의 지역 변수가 됨 2. 네임 스페이스 객체: 네임 스페이스 역할을 할 객체를 생성하고 사용할 변수를 프로퍼티로 추가하는 것 3. 모듈 패턴: 은닉화, 캡슐화를 위해 모듈 패턴을 사용해 프로퍼티를 외부에 노출시키지 않는다.
🔎 헷갈릴 만한 것들
1. 전역 객체
⇒ 전역객체는 코드가 실행되기 이전 단계에 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체이다. (클라이언트에서는 window객체, Node에서는 global 객체)
15장 let, const 키워드와 블록 레벨 스코프
- 실행 컨텍스트: (자바 스크립트) 코드를 실행하는데 필요한 환경을 제공하는 객체
⇒ 식별자 결정을 더욱 효율적으로 하기 위한 수단
👊 실행 컨텍스트로 호이스팅 이해하기
⇒ 호이스팅: 선언문이 마치 최상단에 끌어올려진 듯한 현상
⇒ 변수 정보를 실행 컨텍스트의 환경 record에 저장시켜놓기 때문임 (식별자와 식별자 바인딩 된 값 저장)
1) 변수 호이스팅
- var (생성 단계: 식별자를 스캔해 record하는데, var 키워드이기 때문에 undefined로 초기화 해둠) (실행 단계: 선언문 외 다른 코드 순차적 실행 ⇒ 환경 레코드 업데이트 or 참조)
- let, const (실행 단계: 식별자를 스캔해서 식별자를 record를 해놓지만, 초기화를 시켜놓지는 않음) ⇒ 일시적 사각지대: 선언하면 선언 라인 이전에 식별자 참조할 수 없는 경우
2) 함수 호이스팅
- var (함수 표현식) ⇒ var키워드의 화살표 함수를 선언문 이전에 실행하려고 하면 undefined (TypeError);
- const,let (함수 표현식) ⇒ const 키워드로 화살표 함수를 선언문 이전에 실행하려고하면 참조할 게 없어 Reference Error
- 함수 선언문 (function) ⇒ 선언과 동시에 함수가 생성되어 선언문 이전에 실행하려고 해도 실행이 됨
8장 & 9장 문제
Q1. 다음 코드에서 오류가 나는 부분을 찾고, sum 값이 10이 나오게 바꾸시오! (정답은 많을 수 있음)
Q2. 다음 코드의 결과값과 이유를 설명하시오!
Q3. 다음 코드의 결과값과 이유를 설명하시오!
8장 & 9장 정답
Q1. forEach에서는 break문을 사용할 수 없다. 정답은 많지만 몇 개 적어 보겠슴다.
Q2.
부가설명

Q3.