자바스크립트의 타입
1. 원시 타입
수정이 불가능하다. Immutable
이 값들의 프로퍼티는 읽기 전용이고, 새로운 프로퍼티를 정의할 수 없다는 점에서 객체와 다르다.
숫자
- 자바스크립트는 모든 숫자를 실수로 표현한다.
NaN
숫자가 아닌 값, Infinity
양의 무한대 -> read-only
- NaN은 그 자신뿐만 아니라 다른 값과 같은지 비교할 수 없다.
변수 x가 NaN인지 판단하는 방법
-> x == NaN (x)
-> x != x (o)
-> isNaN() (o) : 인자가 NaN이거나, 문자열/객체처럼 숫자가 아니면 return true
문자열
- 자바스크립트는 문자열의 문자를 바꿀 수 없다. replace(), toUpperCase() 같은 메소드는 기존 문자열을 수정하는 것이 아닌 새로운 문자열을 반환하는 것이다.
- 역슬래시 문자()는 자바스크립트 문자열에서 특별한 목적을 위해 사용한다. \ 뒤에 특정 문자와 결합했을 때 다른 방식으로 표현할 수 없는 문자를 표현하며, 이스케이프 시퀀스라 표현한다.
불리언
- false값:
undefined
, null
, 0
, -0
, NaN
, ""(빈 문자열)
- if (x) ~ -> x가 위의 값들이 아니면 참.
if (x !== null) ~ -> x가 null이 아니면 참. undefined면 참이다.
객체 타입이 아니지만, 메소드를 가진 것처럼 동작할 수 있다.
그 외
null
- 숫자와 문자열에서는 "값이 없음", 객체에서는 "객체가 없음"
- typeof(null) -> object
- 예상 가능한 값의 부재 표현
undefined
- null보다 심한 부재 상태
- 초기화되어 있지 않은 변수, 존재하지 않는 객체 프로퍼티나 배열의 원소 값에 접근, 반환값이 없는 함수의 반환값
- typeof(undefined) -> undefined
- 예기치 않은 상황에 발생한 오류성 값의 부재 표현
2. 객체 타입
- 객체란, 이름과 값을 갖는 프로퍼티의 집합.
- 객체만이 메소드(메소드도 프로퍼티다.)를 소유할 수 있다.
- 수정이 가능하다.
Mutable
- 객체는 값으로 비교되지 않는다. 두 객체가 같은 프로퍼티와 값을 가지고 있어도 두 객체는 같지 않다.
var o1 = {x: 1}, o2 = {x: 1};
o1 === o2
o1 == o2
o1 = o2;
o2.x = 3;
o1.x
o1 === o2
배열
- 객체의 값들은 일반적으로 순서를 가지고 있지 않지만, 배열은 특수하게 순서를 가지고 있는 객체이다.
함수
- 자바스크립트 프로그램은 함수를 보통 객체처럼 다룰 수 있다.
전역 객체
- 일반적인 자바스크립트 객체: Math, JSON
- 전역객체의 프로퍼티는 자바스크립트 프로그램 전역에서 사용할 수 있게 정의된 심벌: undefined, Infinify, NaN
- 최상위 코드에서
this
키워드를 통해 전역 객체 참조 가능
- 클라이언트 측 Window 객체: 브라우저 창에 포함된 모든 자바스크립트 코드를 위한 전역 객체. this 대신
window
를 이용하여 참조할 수도 있다.
래퍼 객체
- 문자열, 숫자, 불리언의 프로퍼티에 접근하려고 할 때 생성되는 임시 객체
변수의 유효범위
- 프로그램에서 어떤 변수가 정의되어 있는 영역
- 같은 이름을 갖는 경우, 함수 내부에서 지역 변수는 전역 변수에 우선한다.
함수 유효범위
- 어떤 함수 안에서 선언된 모든 변수는 그 함수 전체에 걸쳐 유효하다.
호이스팅
- 어떤 함수 안에서 선언된 모든 변수는 변수가 선언되기 전에도 그 함수 전체에 걸쳐 유효하다.
- 함수 안에 있는 모든 변수를 함수 맨 꼭대기로 끌어올린 것처럼 동작한다.
- 지역 변수는 함수 전체에 걸쳐 정의된다.
var scope = "global";
function f(){
console.log(scope);
var scope = "local";
console.log(scope);
}
유효범위 체인(scope chain)
- 변수를 정의하는 객체의 체인(리스트)
- 함수가 정의될 때, 함수는 유효범위 체인을 저장한다.
함수가 호출될 때, 해당 함수의 지역 변수를 저장하기 위해서 새로운 객체를 하나 생성하고, 해당 객체를 기존에 저장된 유효범위 체인에 추가한다.
- 최상위 자바스크립트 코드: 전역 객체
- 중첩되지 않은 함수: 함수 매개변수와 지역 변수를 정의하는 객체, 전역 객체
- 중첩된 함수에서 유효범위 체인: 함수 매개변수와 지역 변수를 정의하는 객체, 전역 객체 +a... (외부에서 함수를 호출할 때마다 중첩된 함수가 매번 선언되므로, 함수를 호출할 때마다 유효범위 체인이 조금씩 달라진다.)
내용 보충 필요
+)
자바스크립트 인터프리터는 메모리 관리를 위해 자동으로 가비지 컬렉션을 수행한다.