var - ES6 이전
→ 함수 수준의 스코프
let - ES6 부터 사용 가능
→ 블록 수준의 스코프
var는 호이스팅 때문에 사용 권장하지 않음
호이스팅 : 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는것을 의미
var로 선언한 경우 호이스팅 시 undefined로 초기화
let,const의 경우 호이스팅 시 변수를 초기화 하지 않음.( 초기화 되어있지 않을때 호출하면 ReferenceError) 초기화를 제외한 선언만 호이스팅
console.log(num); // var 선언으로 undefined 출력됨
var num;
num = 7;
-----------------------------------------------
console.log(num); // 초기화가 되어있지 않기 때문에 ReferenceError
let num = 7;
let 에는 TDZ(Temporal Dead Zone) 일시적 사각지대가 존재한다.
변수 스코프의 맨 위에서 변수의 초기화 완료 시점 까지의 변수는 “TDZ”에 들어간 변수라 표현한다.
console.log(bar); //undefined
console.log(foo); // ReferenceError -> TDZ에 들어가있음
var bar = 0;
let foo = 0;
----------------------------------------------------
//TDZ는 스코프 맨 위에서부터 시작
const func = () => console.log(value);
//TDZ 안에서 value에 접근하면 ReferenceError
let value = 3; //TDZ 종료
func();//TDZ 밖에서 호출
----------------------------------------------------
function func(){
var val = 1;
if(val){
let val = (val +1); // ReferenceError
//(val + 1)에서의 val은 let으로 아직 초기화가 되어있지 않기때문에 ReferenceError 발생
}
}
func();
원시 (primitive) - data, stact에 저장됨 (call stack)
let integer = 123;
let negative = -123;
let double = 1.23;
let binary = 0b1111011; //2진수
let octal = 0o173; //8진수
let hex = 0x7b; //16진수
**주의
0/123 => 0
123/0 => Infinity
123/-0 => -Infinity
123/"text" => NaN (Not a Number)
++추가
BigInt - 2^53-1 보다 큰 정수를 표현하고 싶을때
뒤에 n을 붙이거나 BigInt()호출
let bigInt = 1111111111111111111111111111111n;
let string = 'string'; //",' 둘 다 사용가능
string = 안녕!;
++ 특수문자 출력
string = "'안녕!'"; //'안녕!' 출력
string = '안녕!\\n나야\\t\\t내 이름은\\\\u09AC; //이스케이프표현(줄바꿈,탭,유니코드)
//템플릿 리터럴(Template Literal)
let id = '연하';
let greetings = "'안녕!, "+ id +"\\n즐거운 하루 보내요!'";
greetings = '안녕!, ${id} 즐거운 하루 보내요!';
둘은 출력이
'안녕!, 연하
즐거운 하루 보내요!'로 같다.
let a = true;
let b = false;
!!를 사용하면 값을 boolean으로 변화시킬 수 있다.
//Falshy 거짓인 값
console.log(!!0); //false
console.log(!!-0); //false
console.log(!!''); //false
console.log(!!null); //false
console.log(!!undefined); //false
console.log(!!NaN); //false
//Truthy 참인 값
console.log(!!1);
console.log(!!-1);
console.log(!!'text');
console.log(!!{});//object는 비어있어도 참, 배열도 []
console.log(!!Infinity);
null은 아무것도 담고있지 않은 상태를 명시
undefined는 담고있는지 안담고있는지를 모르는 상태(확정x)
console.log(typeof null); //object
console.log(typeof undefined); //undefined
const map = new Map();
const key1 = 'key';
const key2 = 'key';
map.set(key1, 'Hello');
console.log(map.get(key2)); //Hello
console.log(key1 === key2); //true
-------------------------------------
const map = new Map();
const key1 = Symbol('key'); //이름은 같지만 서로 다른 유일한 키가 생성됨
const key2 = Symbol('key');
map.set(key1, 'Hello');
console.log(map.get(key2)); //undefined
console.log(key1 === key2); //false
--------------------------------------
//동일한 이름으로 하나의 키를 사용하고 싶다면, Symbol.for
// 전역 심벌 레지스트리에 저장됨 (Global Symbol Registry)
const map = new Map();
const key1 = Symbol.for('key');
const key2 = Symbol.for('key');
map.set(key1, 'Hello');
console.log(map.get(key2)); //Hello
console.log(key1 === key2); //true
//심벌의 문자열을 알고싶다면 (변수명?) keyFor은 전역 레지스트리에 보관된거만 가져올 수 있음
console.log(Symbol.keyFor(key1)); // key
const k1 = Symbol('key');
console.log(Symbol.keyFor(k1)); // undefined
const obj = { [k1]:'Hello', [Symbol('key')]:1};
console.log(obj); //{[Symbol(key):'Hello',[Symbol(key)]:1}
console.log(obj[k1]); // Hello
console.log(obj[Symbol('key')]); //undefined 다른 key이기 때문에 접근할 수 없음.
객체 (object) - heap에 저장됨(데이터사이즈가 동적으로 변하는 자료)
{key:value}
let apple = {
name : 'apple',
color : 'red',
display : '🍎',
} ==> apple은 내용물의 주소값을 저장함.(힙이 시작하는 주소), 내용물은 heap에 저장됨
접근 : apple.name
할당 → 사용 → 해제