자바스크립트의 특징 : 인터프리터와 컴파일러의 장점을 결합해 비교적 처리 속도가 느린 인터프리터의 단점을 해결했다.
인터프리터: 코드가 실행되는 단계에서 런타임에 한줄씩 바이트로 변환
변수: 하나의 값을 저장하기 위해 확보한 메모리 공간
변수의 선언
var a;
변수의 할당
a = 80
var로 선언시, 런타임 이전에 undefined로 초기화되며,
런타임시점에 할당시 다른 메모리에 주소값을 할당하고, 해당 식별자로 값이 변경된다.
평가 값
10 + 20 = 30
값: 식이 평가되어, 생성된결과
메모리에는 값만 저장된다
원시타입 : 숫자,문자, 불리언, undefined, null, 심볼
객체타입 : 원시타입이 아닌 것 (배열, 객체, 함수)
null : 변수가 이전에 참조 하던 값을 더 이상 참조 하지 않겠다는 의미 => 가비지 콜렉터에게 수거를 맡김
타입추론시점 : 런타임 시점
1. 데이터 크기 따라서 메모리 크기 확보
2. 값을 참조할떄, 한번에 읽어들일 메모리 공간 크기 결정
3. 2진수를 어떻게 해석할지 결정
typeof : 변수의 데이터 타입이 아니라, 값 의 데이터 타입을 반환한다.
컴파일 : 고급언어를 저급언어로 변환하는 것
정적타입: 컴파일시 타입추론,런타임 이전에 수행, 데이터타입과 값이 맞지 않으면 실행되지 않음. (TS)
동적타입: 런타임시 같이 컴파일이 이루어지며, 타입 추론을 한다 (JS)
원시타입 : immutable(변경불가능) -> 재할당
객체 : mutable(변경가능)
객체는 프로퍼티와 메서드로 구성된다.
const count = {
name: 'test', => 프로퍼티
add: function () => 메서드
}
원시타입과 객체의 차이점
1. 원시는 변경불가능, 객체는 변경가능
2. 원시는 실제값이 저장된 메모리 주소가 참조, 객체는 참조하고 있는 메모리 참조값을 전달
3. 원시는 원본에 원시값이 복사, 객체는 참조값이 복사
원시값을 [] 이런식으로, 유사배열로 사용하면 오브젝트 래퍼객체로 자동변환한다 (JS 엔진에서)
=> string이든, number든 new가 생략되어 있기 떄문
원시타입 : 값이 같을떄 다른 메모리 재할당
참조타입 : 참조값 전달
얇은복사 : 두개의 식별자의 메모리주소 다름, 같은 객체참조, 객체 depth 한겹
깊은복사 : 두개의 식별자 메모리주소다름, 다른 객체참조, 객체 depth 중첩