JavaScript는 느슨한 타입(loosely typed)의 동적(dynamic) 언어
JavaScript의 자료형(타입)
원시값 : 언어의 최고 로우레벨에서 직접 표현되는 불변 데이터
-> Boolean, *Null, *Undefined, Number, BigInt, String, Symbol
* Null: null 하나의 값만 가짐
* Undefined: 값을 할당하지 않은 변수는 undefined 값을 가짐
객체 : 속성의 컬렉션
느슨한 타입 (loosely typed) vs 강력한 타입 (strong typing)
느슨한 타입
: 타입 없이 변수를 선언강력한 타입
: 타입과 함께 변수를 선언정적 언어 (static language) vs 동적 언어 (dynamic language)
정적 언어
: 자료형(타입)을 컴파일 시 결정
동적 언어
: 컴파일 시 자료형을 정하지 않고 실행 시 결정
장점 | 단점 | 종류 | |
---|---|---|---|
정적 언어 | 컴파일 시 타입 정보 결정해 속도↑ , 타입 에러로 인한 문제를 초기에 발견 가능한 안정성↑ | 매번 코드 작성시 변수형을 결정해줘야 하는 번거로움 | C, C#, C++, Java |
동적 언어 | 배우기 쉬운 언어,Run time까지 타입 선택 가능 | 실행 중 변수에 예상치 못한 타입이 들어와 Type Error 발생 가능 | JavaScript, Ruby, Python, SmallTalk |
타입 변환은 느슨한 타입과 아주 가까운 관계가 있는 주제
내부적으로 타입이 관리되기 때문에 타입들이 내부적으로 변환 가능JavaScript 엔진이 필요에 따라 ‘암시적변환’ or 개발자의 의도에 따라 ‘명시적변환’ 을 실행
JavaScript 엔진이 필요에 따라 자동으로 자료형을 변환
엄격하지 않은 동치(==)
: 좌우항 변환할 경우 값만 비교엄격한 동치(===)
: 데이터타입을 변환하지 않아 자료형이 다르면 false개발자가 의도를 가지고 데이터타입을 변환
참조형은 기본형 데이터의 집합
참조형 데이터는 값이 지정된 주소의 값을 할당
// 작성중 😥📝
선언 단계(Declaration phase): 변수를 실행 컨텍스트의 변수 객체에 등록
→ 스코프가 참조하는 대상
초기화 단계(Initialization phase): 실행 컨텍스트에 존재하는 변수 객체에 선언 단계의 변수를 위한 메모리 생성 (undefined로 초기화)
할당 단계(Assignment phase): undefined로 초기화된 메모리에 다른 값을 할당
👉 변수가 선언되고 초기화되기 사이의 사각지대 (스코프의 시작 지점부터 초기화 시작 지점까지), 비유하자면 선언 단계와 초기화 단계 사이에 잠시 머물러 있는 것
var 변수의 라이프사이클
호이스팅
(Hoisting) 발생📍호이스팅
: var 로 선언된 표현식, 함수 선언문 등을 실행 단계에서 해당 스코프의 맨 위로 끌어 올리는 것
let/const 변수의 라이프사이클
var과 다르게 선언 단계와 초기화 단계가 따로 분리되어 실행
→ 선언 단계와 초기화 단계 사이에서는 실행 컨텍스트에는 변수를 등록했지만 메모리가 할당되지 않은 상태라 ReferenceError
가 나오는 데 이런 사각지대가 TDZ
초기화 단계에 오면 TDZ 상태가 해제
(문제) 콘솔에 찍힐 b 값을 예상해보고, 어디에서 선언된 “b”가 몇번째 라인에서 호출한 console.log에 찍혔는지, 왜 그런지 설명해보세요.
주석을 풀어보고 오류가 난다면 왜 오류가 나는 지 설명하고 오류를 수정해보세요.
let b = 1;
function hi () {
const a = 1;
let b = 100;
b++;
console.log(a,b); // (2) line 4, hi() 함수 내 선언된 b값 호출
}
//console.log(a); // (4) 주석 삭제시 오류 발생
console.log(b); // (1) line 1, 맨 처음에 선언된 b값 호출
hi();
console.log(b); // (3) line 1, 맨 처음에 선언된 b값 호출
(1) 맨 처음 b에 선언 및 할당된 값 -> 1
(2) hi() 함수를 호출하여 함수 내 b값 -> 101
(3) let은 block level scope이기에 (2)의 값 영향 받지 않고 (1)과 동일하게 출력 -> 1
(4) 선언된 변수 a가 없기 때문에 오류 발생, line 3의 a는 해당 함수 안에서만 유효한 변수