객체가 아니면서 method를 가지지 않는 6가지의 타입
string, number, bigint, boolean, undefined, symbol, (null)
원시자료형은 한개의 데이터만을 담을 수 있다. 변수에도 한개의 데이터만 담을 수 있다.
'문자열', 3, true 등
원시 자료형이 아닌 모든 것은 참조 자료형
배열[]
과 객체{}
, 함수function(){}
가 대표적
참조자료형은 한개의 데이터를 담은 것이 아닌 데이터들이 담겨있는 주소가 담긴다.
참조 자료형은 기존 고정된 크기의 보관함이 아닌 동적으로 크기가 변하는 보관함을 사용할 수 있다.
let a = [1, 2, 3]; // 임의의 배열을 가진 변수 a
let b = [1, 2, 3]; // 임의의 배열을 가진 변수 b 둘의 배열은 같아 보이지만
a === b // false a와 b가 다른 이유는 둘의 배열의 생김새는 같지만 a가 가진 [1, 2, 3] 과
// b가 가진 [1, 2, 3] 은 다른 주소를 가지고 있기 때문에 둘은 같지 않다.
c = a;
c.pop();
console.log(c) // [1, 2] 배열의 마지막 인덱스를 지우는 pop 때문에 c의 값은 [1, 2]이다.
console.log(a) /* [1, 2] c에 pop을 넣었지만 c는 a의 주소를 받은 것이기 때문에
변수 a의 결과값 역시 [1, 2]가 된다. */
let a
는 가장 바깥쪽 scope로 모든 scope가 이용가능한 전역 변수이다. 그리고 scope1은 전역scope이다.
let b
는 scope2의 변수이고 scope2와 scope3, scope4에서 이용 가능하며 scope1에서는 변수 b를 사용할 수 없다.
결과적으로 scope4에서는 모든 변수를 이용할 수 있지만 scope3에서는 d를 이용할 수 없고 2에서는 c,d를 이용할 수 없으며 1에서는 b,c,d 변수를 모두 이용할 수 없다.
let | const | var | |
---|---|---|---|
유효범위 | 블록&함수스코프 | 블록&함수스코프 | 함수스코프 |
값 재할당 | 가능 | 불가능 | 가능 |
재선언 | 불가능 | 불가능 | 가능 |
참고
클로저 함수는 외부 함수의 변수에 접근할 수 있는 내부 함수, '함수를 리턴하는 함수' 리턴된 함수가 클로저 함수이다.
외부 함수는 내부 함수의 변수에 접근할 수 없지만 내부 함수는 외부 함수의 변수에 접근 할 수 있다.
클로저 함수는 데이터를 보존 할 수 있다.
let minus = function(a) {
return function(b) {
return a - b;
}
}
let que2 = minus(10);
que2(7); //3
que2(5); //5
위의 식을 보면 minus의 지역변수 a 에 10 을 넣어줬는데 a = 10 이라는 숫자가 que2라는 변수에 저장이 되어있다. que2 만 이용한다면 다시한번 minus에 10이라는 변수를 주지 않아도 된다. 이런것을 보고 데이터를 보존 할 수 있다.
내부와 외부의 끊임없는 충돌 그걸 지켜보는 나 그건 아마도 전쟁같은 코딩