자바스크립트에서 타입이란, 자바스크립트 엔진과 개발자 모두에게
어떤 값을 다른 값과 분별할 수 있는 고유한 내부 특성의 집합이다.
자바스크립트에는 다음 7가지 내장 타입이 있다.
-
null
-
undefined
-
boolean
-
number
-
string
-
object
-
symbol
1. 원시 타입과 참조 타입
자바스크립트에서는 원시 타입(primitive type) 참조 타입(reference type)이라는 두 가지 자료형을 제공한다.
object를 제외한 나머지 타입들은 모두 원시 타입이다.
원시 타입 데이터는 변수에 할당될 때 메모리 상에 고정된 크기로 저장되고 해당 변수가 원시 데이터 값을 보관한다.
let x = 100; // 원시 타입 데이터를 선언
let y = x; // 값을 새 변수에 복사
x = 99; // x의 값을 변경, y의 값은 변경되지 않음
console.log(y); // 100
object는 참조 타입이다.
array나 function 같은 것은 object에 속한다.
참조 타입 데이터는 크기가 정해져 있지 않고 변수에 할당될 때 값이 직접 해당 변수에 저장될 수 없으며,
변수에는 데이터에 대한 참조만 저장된다. 참조는 참조 타입 데이터의 주소이지 해당 데이터의 값이 아니다.
let x = { count: 100 }; // 참조 타입 데이터를 선언
let y = x; // 참조를 새 변수에 복사
x.count = 99; // 참조 타입 데이터를 변경, y는 동일한 참조를 담고 있음
console.log(y.count); // 99
2. 내장 타입
값 타입은 typeof 연산자로 알 수 있다.
typeof undefined // "undefined"
typeof true // "boolean"
typeof 42 // "number"
typeof "42" // "string"
typeof { apple : 30 } // "object"
typeof Symbol() // "symbol"
단 null에 대한 typeof 연산 결과는 조금 다르다.
타입이 null이 아니라 object로 나온다.
typeof null // "object"
따라서 타입으로 null 값을 정확히 확인하려면
다음과 같이 falsy값을 확인하는 조건이 하나 더 필요하다.
const a = null;
(!a && typeof a === "object"); // true
typeof는 이 외에도 "function"이라는 타입을 반환한다.
typeof function foo(){} // "function"
위 결과를 보면 function이 마치 또 다른 내장 타입같지만,
위에서 언급했듯 function은 object의 하위 타입이다.
함수는 객체이기 때문에 함수에 프로퍼티를 둘 수 있다.
함수에 선언된 인자 개수는 함수 객체의 length 프로퍼티로 알 수 있다.
function foo(a, b){}
foo.length; // 2
배열 역시 object의 하위 타입이다.
typeof [1,2,3] // "object"
3. 값은 타입을 가진다
값에는 타입이 있지만, 변수에는 따로 타입이 없다.
변수는 언제라도, 어떤 형태의 값이라도 가질 수 있다.
자바스크립트는 '타입 강제'를 하지 않기 때문에, 변숫값이 처음에 할당된 값과 동일한 타입일 필요가 없다.
숫자를 넣었다가 나중에 문자열을 넣어도 상관없다.
변수에 typeof 연산자를 대어 보는 건 실제로 "이 변수에 들어있는 값의 타입은 무엇이니?"라고 묻는 것이다.
let a = 42;
typeof a; // number
a = true;
typeof a; // boolean
https://github.com/getify/You-Dont-Know-JS
getify/You-Dont-Know-JS
A book series on JavaScript. @YDKJS on twitter. Contribute to getify/You-Dont-Know-JS development by creating an account on GitHub.
github.com
'Javascript' 카테고리의 다른 글
자바스크립트 문자열 (0) | 2019.12.29 |
---|---|
자바스크립트 배열 (0) | 2019.12.29 |
선언되지 않은 변수 (0) | 2019.12.14 |