원시 자료형과 참조 자료형의 차이를 이해하자!
원시 자료형은 하나의 정보, 즉 데이터를 담고 있다. 예전에는 데이터의 저장소의 용량이 제한적이었기 때문에 변수 하나에 제한된 하나의 원시 자료형을 담을 수 밖에 없었다.
원시자료형은 객체가 아니면서 method를 가지지 않는 6가지의 타입이 있다.
string, number, bigint, boolean, undefined, symbol, (null)
참조 자료형은 하나의 주제로 서로 다른 여러 개의 데이터를 가지고 있다.
대량의 데이터가 들어오는 경우는 고정된ㄷ 데이터 공간을 사용하는 것이 비효율적이에 데이터의 크기가 동적으로 변하는 특별한 데이터의 보관함의 필요성에 의해 참조 자료형이 나타남
데이터가 위치한 곳을 가리키는 주소가 변수에 저장됨 우리가 직접 다루는 변수에는 주소가 저장되기 때문에 reference type이라고 불리며 이런 특별한 보관함을 heap이라고도 부른다.
객체, 배열, 함수등 원시 자료형이 아닌 모든 것
스코프는 변수의 유효범위!
중괄호(블록) 안쪽에 변수가 선언되었는가, 바깥쪽에 변수가 선언되었는가가 중요합니다. 이 범위를 우리는 스코프라고 부릅니다.
1. 바깥쪽 스코프에서 선언한 변수는 안쪽 스코프에서 사용 가능
2. 안쪽 스코프에서 선언한 변수는 바깥쪽 스코프에서 사용 불가능
3. 스코프는 중첩이 가능하며 가장 바깥쪽의 스코프는 전역 스코프 그 외는 지역 스코프
4. 지역스코프에 선언한 변수는 지역 변수, 전역 스코프에서 선언한 변수는 전역 변수이며
**지역변수는 전역변수보다 더 높은 우선순위를 가진다.**
블록 스코프와 함수 스코프
1. 중괄호를 기준으로 범위가 구분되는 블록 스코프(if문, for문 등)
2. function 키워드가 등장하는 함수 선언식 및 표현식은 함수 스코프
function getName(user){
return user.name; ->함수 선언식
}
--------------------------------------------
let getAge = function(user) {
return user.age; ->함수 표현식
}
**화살표 함수는 블록 스코프 취급된다!. 유의합시다.
let 키워드 사용이 권장됨
변수를 정의하는 또다른 키워드 var
1. var키워드는 블록 스코프를 무시하고, 함수 스코프만 따릅니다. 그러나, 모든 블록 스코프를 무시하는 건 아닙니다. 화살표 함수의 블록 스코프는 무시하지 않습니다.
2. 선언 키워드가 없는 선언은 최고 스코프에 선언(var로 선언한 전역 변수로 취급됨) 그러나 함수내에서 선언 키워드 없는 선언은, 함수의 실행 전까지 선언되지 않은 것으로 취급
3. var은 블록 스코프를 무시하기 때문에 코드가 혼란스러울 수 있다. 이에 var 보다는 let으로 변수 선언을 하는 것을 권장
4. var키워드는 재선언을 해도 에러를 내지 않는다.
**전역변수는 어디서든 접근 가능한 변수지만 다른 함수 혹은 로직에 의해 의도되지 않은 변경이 발생할 수 있기 때문(side effect)에 전역변수는 최소화가 중요**
**'use strict'를 통해 문법적으로 실수 할 수 있는 부분을 에러로 판단해줌