관리 메뉴

개발캡슐

[You don't know JS] Chap1. 타입과 문법 본문

스터디/도서-Youdon'tknowJS

[You don't know JS] Chap1. 타입과 문법

DevGreeny 2023. 4. 13. 23:04

Chap1. 타입과 문법

Chap1. 타입

ECMA 표준 명세서 5.1에 따르면, 자바스크립트에서 사용되는 모든 값은 타입이 존재해. 이 타입은 ECMAScript 언어 타입과 명세 타입으로 분류돼.

ECMAScript 언어 타입에는 Undefined, Null, Boolean, String, Number, Object가 있어.

타입이란 개념은 자바스크립트 엔진과 개발자 모두가 어떤 값을 다른 값과 분별할 수 있는, 고유한 내부 특성의 집합이라고 정의해.
따라서, 자바스크립트에는 '타입'이 존재하고, 이를 하위 타입(Subtype)이나 태그(Tag)로 부르는 경우도 있어.
이건 명세에서 정의한 타입의 개념과 다르지 않아.

자바스크립트는 기계와 사람이 모두 이해할 수 있는 값을 다루기 위해 타입이 존재해.
예를 들어, 숫자 42와 문자열 "42"는 서로 다른 타입을 가지고 있다고 할 수 있어.
자바스크립트는 실제 타입을 다루는 방식도 이와 비슷해.

1.1 타입, 그 실체를 이해하자

자바스크립트에서의 타입과 강제변환에 대해 다룰거야.

타입은 값의 내재된 특성을 의미해. 타입을 정확하게 이해하고 사용해야 값을 다른 타입으로 변환하는 방법을 이해할 수 있어.

강제변환은 타입을 자동으로 변환하는 과정을 말하고, 자바스크립트에서는 거의 모든 프로그램에서 일어나. 이에 대해 개발자들은 주의해야 해. 값과 타입에 대한 확실한 이해가 필요해.

1.2 내장 타입

자바스크립트 내장 타입. 자바스크립트에는 null, undefined, boolean, number, string, object, symbol (ES6부터 추가)이라는 7가지 내장 타입이 있어.

- 이들을 '원시 타입'이라고 불러.
- typeof 연산자를 이용하여 각 타입을 확인할 수 있어.
- typeof 연산 결과가 항상 내장 타입과 1:1로 정확히 매치되지는 않아.

<예시>

💡
typeof undefined = = = "undefined"; // true
typeof true === "boolean"; // true
typeof 42 = = = "number"; // true
typeof "42" = = = "string"; // true
typeof { life: 42 } = = = "object"; // true

// ES6부터 추가!
typeof Symbol = = = "symbol"; // true

 

//특별한 녀석 예시 -
typeof null === “object” //true (버그)

//원래는 이게 정답…인데 버그로 위 같은 결과가..계속..
typeof null === “null” //(이게 정답)

null은 원래 object 타입이라는 버그가 있었는데, 이는 이미 많은 웹 소프트웨어에서 사용되어서 손을 대자니
다른 버그가 생겨서 해결하기가 어려워졌어.


결국, null 값을 정확히 확인하기 위해서는 typeof 연산자로 확인하는 것 외에도,
null 값을 체크하는 추가적인 조건이 필요해.

<예시>

💡 var a = null; (!a && typeof a === "object"); // true

null은 falsy한 값이고, typeof null의 결과는 'object' 야.

typeof가 반환하는 문자열은 하나 더 있어.

typeof function a(){ /* */ } === "function"; // true

 

함수는 객체라 typeof로 확인할 때 결과는 'function' 야.

명세에서 함수를 객체의 하위 타입으로 분류해, 함수는 호출 가능한 객체(callback)라고 명시되어 있어. 함수가 객체라서 함수에 프로퍼티를 추가할 수 있어.
함수 객체의 length 프로퍼티는 함수에 선언된 인자의 개수를 나타내서,

function a(b, c) {
/…/
}

 

함수에 선언한 인자 개수는 함수 객체의 length 프로퍼티로 알 수 있어.

a.length; // 2

 

함수 a는 인자 두 개 (b. c)를 가지므로 함수의 길이는 2야.

 

배열은?

자바스크립트에서 배열은 객체의 하위 타입으로 분류돼. 배열은 객체와 마찬가지로 키와 값으로 구성된 집합이지만, 키는 숫자로 이루어진 인덱스이고, 추가적으로 length 프로퍼티를 가지고 있어. 따라서 typeof 연산자로 배열의 타입을 확인하면 "object"가 반환돼.