자바스크립트에서 타입이란, 자바스크립트 엔진과 개발자 모두에게

어떤 값을 다른 값과 분별할 수 있는 고유한 내부 특성의 집합이다.

 

자바스크립트에는 다음 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

+ Recent posts