1. variable
변수는 데이터를 저장하는 컨테이너로(보관함) var, let, const가 있다.
2. blockScope
- ES6표준에서 let, const를 도입하면서 js에서 사용가능
{ } 블록단위내에서 (if-else, while, for 그리고 try-catch) 유효 범위를 갖게 하는 스코프이다.
- var를 통해 변수를 블록스코프안에서 사용하면 전역 스코프, 함수 스코프로 인식되어 접근이 가능 그러나 let을 통해 선언하면 해당 블로내에서만 접근 가능해서 출력 안됨
{let jess="안녕"}
console.log(jess)
//안녕
{let je="안녕"}
console.log(je)
//Uncaught ReferenceError: je is not defined at <anonymous>:2:13
3. var를 쓰면 안되는 이유
: var는 ES6전에 사용한 변수이다.
1. var선언하기 전에 값을 할당해 할당전에도 값이 출력됨
2. 중복선언이 가능 -> var hoisting때문
- var hoisting: 변수의 선언부를 Scope최상단으로 올림
- js는 Function-scoped이므로,코드 전체의 최상단이 아닌 "함수 내부의 최상단"으로 이동
3. 블럭스콥이 없음 철저히 무시함
* Function-scoped란
함수 내에서 선언된 변수는 함수 내에서만 유효함. 함수 외부에서는 참조할 수 없다.
- 함수 내부에서 선언한 변수는 지역변수
- 함수 외부에서 선언한 변수는 전역변수
* Block-level-scope
대부분 프로그래밍은 block을 사용 , js는 function-scope사용
- 모든 코드 블록 (if, while, try-catch 등) 선언된 변수는 코드 블록내에서만 유효
- 블록 외부에서는 참조할 수 없다.
- 블록 내부에서 선언한 변수는 지역변수다.
참고
https://hoondev.tistory.com/101
4. let, constants
var키워드의 단점을 보완하기위해 등장
- 차이: immutable, mutable
let
- 재할당이 가능 -> mutable
const
- 재할당이 불가능 -> immutable
- 값을 한번 할당하면 값이 절대 바뀌지 않으므로 상수
- 보안에 좋음 (해커가 값을 변경방지)
참고
https://poiemaweb.com/es6-block-scope
5. variable type
- primitive, single item: number, string, boolean, null, undefined, symbol
:기본 값으로 객체를 제외한 변경할 수 없는 값을 정의하는 더이상 나눠지지 않는 한가지 타입
- Null: 하나의 값 null만 있음 (텅텅 비어있는, 아무것도 아니야!)
- undefined: 하나의 값 undefined만 있음 (선언은 되었지만 값이 할당되지 않음)
- Boolean: true , false 있으며 삼항 연산자, if~else, while 등 같이 조건부 연산에 사용
- false: 0, null, undefined, NaN, ‘’, 3<1
- true: any other value
- Number:
- infinity : 1/0
- -infinity : -1/0
- NaN: 숫자가 아님 : ‘hello’/2
- BigInt:
- String: 백틱이용하게되면 간편하게 string 만들 수 있음
- object: box container
- 싱글을 묶어서 한단위로 관리
- function, first-class function
- 펑션도 다른 데이터타입처럼 할당이 가능하고 , 인자, 리턴으로도 가능하다.
6. symbol
- 고유한 식별자, 우선순위를 주고 싶을때, 동일한…?
7. dynamic typing
: RUN타임때 타입이 정해져서 유연하지만 위험하기도하다.
8. 호이스팅이 진행과정
[ 변수는 3단계에 걸쳐 생성 ]
- 선언 단계: 변수객체에 등록되며, 이 객체는 스코프가 참조하는 대상이 된다.
- 초기화 단계: 변수객체에 등록된 변수를 위한 공간을 메모리에 확보하면서 변수는 undefined상태
- 할당 단계: undefined로 초기화된 변수에 실제 값을 해당
[ 변수 호이스팅 과정 ]
이때 var로 선언된 변수는 선언단계/초기단계로 이루어지며,
스코프에 변수를 등록(선언 단계) > 메모리에 변수를 위한 공간 확보 > undefined 초기화 한다.
-> 그러므로 접근해도 "error"대신 "undefined"를 반환 그리고 변수에 할당문에 도달해야 값이 할당됨
[ let ]
let키워드로 선언된 변수는 선언단계/초기단계로 "분리"되어 진행.
- 선언단계: 스코프에 변수를 등록
- 초기화 단계: 변수 선언문에 도달할때 이루어짐
-> 초기화 이전에 변수에 접근하면 에러발생 "변수를 위한 메모리 공간이 아직 확보되지 않았기 때문"
console.log(bal);
let bal;
//Uncaught ReferenceError: bal is not defined at <anonymous>:1:13
console.log(ball);
var ball;
//undefined