동명의 해체된 오버워치 프로게임단에 대한 내용은 UNDEFINED(프로게임단) 문서 참고하십시오.
관련 문서: 컴퓨터/표현
프로그래밍 언어 문법 | ||
{{{#!wiki style="margin: -16px -11px; word-break: keep-all" | <colbgcolor=#0095c7><colcolor=#fff,#000> 언어 문법 | C(포인터) · C++(자료형 · 특성 · 클래스 · 이름공간 · 상수 표현식) · C# · Java · Python · Kotlin · MATLAB · SQL · PHP · JavaScript |
마크업 문법 | HTML · CSS | |
개념과 용어 | 함수 · 인라인 함수 · 고차 함수 · 람다식 · 리터럴 · size_t · 상속 · 예외 · 조건문 · 참조에 의한 호출 · eval | |
기타 | == · === · NaN · null · undefined · 모나드 · 배커스-나우르 표기법 | |
프로그래밍 언어 예제 · 목록 · 분류 | }}} |
1. 개요
JavaScript언어에서 '아직 할당하지 않은 값'을 표현하기 위해 사용하는 값. null과는 사용 방식이 약간 다른데, null이 아예 '일부러 비워 둔 값'을 의미하는 것이라면, undefined는 아직 변수 또는 프로퍼티가 할당되지 않았음을 의미한다.2. undefined가 발생하는 경우
자바스크립트에서는 정말 자주 볼 수 있는데, 객체에서 없는 프로퍼티를 꺼내려고 하거나[*#!syntax javascript
const obj = {};
obj.a // undefined
], 함수를 호출할 때, 값이 들어오지 않은 매개변수를 사용하려 한다거나[* #!syntax javascript
function f(a, b) {
console.log(a);
console.log(b);
}
f(1) // a는 1이 나오지만, b는 undefined로 출력됨
], 아직 값이 할당되지 않은 변수를 사용하려 할 때[* #!syntax javascript
let a;
a // undefined
][1], 배열의 범위를 넘어서는 값을 가져오려 할 때[* #!syntax javascript
[1, 2, 3][3] // undefined
][2], 그리고 함수가 아무것도 반환하지 않을 때[* #!syntax javascript
function a () {}
a() // undefined
]도 undefined
를 만날 수 있다!이런 특징으로 인해 디버깅이 상당히 어려워 지는데,
undefined
는 (객체가 아니기에)속성도 가지지 않고, (함수도 아니기에) 호출할 수도 없다. 그래서 코드 중간에서 오타 등으로 인해 존재하지 않는 프로퍼티를 꺼냈을 때, 원하는 값 대신 undefined
가 나오게 되고, 이 값을 나중에 사용하는 부분에서 Uncaught TypeError: Cannot read property '...' of undefined
또는 Uncaught TypeError: ... is not a function
등의 오류를 맞닥트리게 되며, 버그의 원인과 발견 지점이 멀어지게 되고, 결국엔 디버깅 난이도를 높이게 된다.[1] 참고로 아예 선언 자체를 안한 변수를 사용하려고 하면
Uncaught ReferenceError: ... is not defined
예외가 발생한다.[2] 다만 이 경우는 1번 경우의 특수한 사례인데, 자바스크립트에서 배열은 객체의 일종이기 때문이다. 즉 arr라는 배열이 있을 때, arr[0]
는 arr객체의 0이라는 프로퍼티를 꺼낸 것과 같다.[3] [][[]]+[][[]]
만으로 NaN이 나온다!