Javascript와 변수
자바스크립트를 처음부터 다시 생각하고 공부해 보려고 한다.
자바스크립트에서 변수란 무엇일까?
프로그래밍 언어에서 변수는 메모리의 위치를 가지는 이름라고도 볼 수 있다.
Javascript에서는 3가지 변수 지정방법이 있다.
var 와 let, const 의 차이는 var 는 function scoped 에 포함되고, let, const 는 block scoped에 포함된다는 차이가 있다.
var 는 같은이름의 변수를 재 선언할 수 있지만, let 과 const 로 선언한 변수는 같은 block scoped 내에서는 재선언 할 수 없다.
let 과 const 의 차이는 const 는 선언한 이후 값을 변경할 수 없지만, let은 값을 변경할 수 있다.
위와 같이 a = 1 을 지정하면 메모리의 공간에 원시값을 설장하고 메모리의 위치 값을 전달한다.
Javascript 에서의 메모리 공간은 Stack, Heap, Static 공간으로 나뉘어 저장되는데, 변수중 참조타입은 Heap 공간에 할당한다.
스코프
Javascript 의 global 로 지정한 변수는 window (BOM) 전역 스코프에 포함되게 된다.
다른 스코프에서 값을 찾는데 없다면, 스코프 체이닝이 일어나면서, window 스코프까지 참조하게 된다.
민악 함수 내에서 변수 선언 이전에 값을 호출하려고 하고, 변수를 선언한다면, 전역 변수로 같은 이름의 변수가 있더라도 해당 값을 얻을수 없는데 이를 호이스팅 이라고 한다. 이는 실행 컨텍스트 내에의 변수 참조하려고 하지만 아직 값이 할당되지 않았기 때문이다.
원시 타입과 참조 타입
Javascript는 원시 타입 (primitive type) 과 참조 타입 (reference type) 이 존재한다.
Number, String, Boolean, null, undefined 은 원시타입이다.
Object, Array, Function 은 참조 타입이다.
참조 타입은 (메모리의) 위치 값을 공유하기 때문에 참조하고 있는 모든 변수들이 값이 변경된것 처럼 보인다.
Symbol 데이터 형은 원시 타입이다.
변수 복사
원시 타입의 변수 복사는 원시 값을 새로 생성하여, 독립적인 값을 가질수 있다.
참조 타입의 변수 복사는 참조 값을 복사하여 변수에 할당한다.
때문에 복사한 변수의 property 을 변경하면, 원본 변수의 값도 변경되는데, 이런 문제를 앝은 복사하고 하며, 이때 깊은 복사를 통해 새로운 객체를 생성하여 문제를 해결할 수 있다.
프로토 타입
모든 변수의 프로토 타입은 최종적으로 Object Prototype을 가르킨다.
var a = 1 는 원시값 1을 가지게 된다.
이후 a 는 Number Prototype 을 참조하며, Number Prototype은 Object Prototype 을 가리키는데, 이 때문에 변수 a 는 Object Prototype의 Method를 사용할 수 있다.
타입 확인
typeof 를 이용해서 원시타입을 확인할 수 있다.
instanceof 를 이용해 참조타입 확인할 수 있다.