[JS] typeof 연산자로 값을 확인해보자

김재훈·2022년 10월 21일
2
post-thumbnail

Today Objectives

  • typeof 연산자를 이용하여 주어진 리터럴의 타입을 확인할 수 있다.
  • typeof 연산자를 이용하여 주어진 변수의 타입을 확인할 수 있다.


typeof 연산자의 역할은 무엇일까?

typeof 연산자는 피연산자의 평가 전 자료형을 나타내는 문자열을 반환합니다.
-MDN typeof

위 문장을 하나 하나 뜯어보며 이해해봅시다.

연산자는 주어진 피연산자를 대상으로 어떠한 연산(행위)을 수행하는 구문을 말합니다. 여기서 피연산자는 1~3개가 될 수 있으며 각 경우에 따라 1개라면 단항 연산자, 2개라면 이항 연산자, 3개라면 삼항 연산자로 호칭합니다.

피연산자는 연산(행위)을 당하는 대상입니다. 피연산자는 리터럴이나 변수가 될 수 있습니다. 여기서 리터럴은 사람이 이해할 수 있는 문자나 약속된 기호를 사용해 표기하는 방법입니다. 예시를 들면 3은 숫자 리터럴, 'happy'는 문자열 리터럴, true는 Boolean 리터럴이라고 할 수 있겠습니다.


이제 typeof의 역할을 설명할 수 있습니다.

결국 typeof 연산자는 연산할 대상(피연산자)을 전달해 주면 그 아이의 자료형(Type)이 무엇인지 판단한 결과를 우리가 이해할 수 있는 문자열(숫자라면 Number, 문자열이라면 String 등)으로 알려준다는 얘기입니다.

아직도 이해가 어려운가요? 그럴 수 있습니다. 더 쉬운 이해를 위해 아래 코드 예시와 함께 이해해봅시다.

console.log(typeof 3);
console.log(typeof 'happy');
console.log(typeof true);

위 코드의 결과가 어떻게 될지 자신이 사용하는 웹 브라우저의 개발자 도구에서 직접 실행해 보세요. 결과는 어땠나요?

처음 주어진 3은 온전한 숫자였습니다. 정수이지만 JS에서는 모든 숫자를 정수/실수 구분하지 않고, 모두 실수로 처리하며 Number라는 하나의 타입으로 처리합니다.
두번째 'happy'는 문자열인 String 타입이었습니다. 우리는 주어진 리터럴이 작은/큰 따옴표로 쌓여있으면 문자열로 인식하기로 약속했습니다.
마지막 true는 참을 뜻하는 예약어(keyword라고도 합니다.)로 Boolean 타입으로 인식됩니다. false도 마찬가지이며 거짓을 뜻하는 예약어입니다.

number
string
boolean

피연산자는 리터럴이 아닌 변수도 전달할 수 있으며, 리터럴에서 전달했던 값과 변수에 저장했던 값이 동일하다면 동일한 동작 결과가 표시됩니다.

let num = 3;
let happy = 'happy';
let isTrue = true;

console.log(typeof num);
console.log(typeof happy);
console.log(typeof isTrue);



typeof Deep Dive

우리가 놓치기 쉬운 엣지 케이스에서의 typeof 사용례를 살펴 보고 이해도를 높여 봅시다!😤

아직 선언되지 않은 변수의 타입을 확인하려 한다면...

undefined 타입을 반환합니다.

console.log(typeof notYet);
// -> undefined

객체의 타입을 확인하려 한다면...

object 타입을 반환합니다.

let person = {
  name: 'jaehun',
  age: 24
};

console.log(typeof person);
// -> object

함수의 타입을 확인하려 한다면...

function 타입을 반환합니다.

function printSome() {
  console.log('something');
}

console.log(typeof printSome);
// -> function

숫자와 문자열을 비교하려 한다면...

false 값을 반환합니다. 대소 비교 연산자는 number 타입과 비교를 시도하는 경우 String 값도 Number 타입으로 형 변환이 이뤄지는데, 숫자만 적힌 문자열 리터럴이 아닌 경우 NaN 값이 됩니다. NaN과 숫자의 비교는 항상 false이기 때문에 이를 반환하는 것입니다.

console.log(typeof 'test' > 1);
// -> false

위 예의 함정이 있습니다. 위 비교의 결과가 false라면 typeof 연산자가 반환하는 결과는 Boolean이 되어야 함에도 false가 반환되었습니다. 그 이유는 연산자 우선순위에 의한 것으로 typeof 연산자보다 비교 연산자가 더 우선순위에 있기 때문입니다. 이에 비교 구문을 괄호로 감싸면 제대로 결과가 반환됩니다.

console.log(typeof ('test' > 1));
// -> boolean

typeof 결과의 타입을 확인하려 한다면...

처음 정의에서 말했듯 typeof 연산자는 연산 결과를 String으로 반환합니다. 고로 typeof 결과의 타입을 확인하면 String을 반환합니다.

console.log(typeof typeof 1);
// -> string

console.log 없이 typeof를 사용한다면...

콘솔에 문자열을 출력하는 것이 아닌 문자열 리터럴 자체가 그대로 반환됩니다.

// console.log 사용
console.log(typeof 1);
// -> number

// typeof 단독
typeof 1;
// -> "number"



마치며

typeof의 간단한 사용례와 설명을 적어 보았으며, 발생할 수 있는 엣지 케이스에 대해 적어 보았습니다.
상술한 엣지 케이스는 자주 만나는 문제가 아니기 때문에 모두 체화할 필요는 없으며, 이런 게 있구나 정도로 이해하셨다가 문제가 발생했을 때 직접 개발자 도구나 터미널 등 편한 도구를 이용해 실험해보거나 MDN 문서를 참고하는 것이 효율적일 것입니다.

마치며 중간에 typeof 연산자를 설명할 때 필요 없는 내용도 포함된 감이 없지 않지만 알아야 되는 부분이라 생각하고 넣었으니 읽는 모든 분들께 도움이 되셨길 바랍니다.

profile
개발하면서 새롭게 배운 내용, 시행착오한 내용들을 잊지 않기 위해 기록합니다.

0개의 댓글

관련 채용 정보