JavaScript에서 정의되지 않은 변수를 확인하는 방법


912

변수가 정의되어 있는지 확인하고 싶었습니다. 예를 들어 다음은 정의되지 않은 오류를 발생시킵니다.

alert( x );

이 오류를 어떻게 잡을 수 있습니까?



5
이 같은 외모는 할아버지입니다 : stackoverflow.com/questions/1485840/...의 stackoverflow.com/questions/2647867/... - 위대한 그 램프 어쩌면이 : stackoverflow.com/questions/27509/...
임의

1
이것은 표시된 복제본의 복제본이 아닙니다. 변수 해상도와 객체 속성 해상도는 매우 다릅니다. 자바 스크립트에 변수가 있는지 확인 하는 것이 더 나은 복제 입니까? .
RobG

변수가 선언되지 않았기 때문에 오류가 발생했습니다. 대부분의 답변은 과제에 중점을 둡니다. 자세한 내용은 내 대답 을 참조하십시오 . 또한 많은 사람들이 null 및 undefined가 JavaScript의 객체라고 잘못 설명합니다. 그것들은 객체 가 아니라 원시적이다 ...
JBallin

답변:


1690

JavaScript에서 null객체입니다. 존재하지 않는 것에는 또 다른 가치가 있습니다 undefined. DOM은 null문서에서 일부 구조를 찾지 못하는 거의 모든 경우에 대해 반환 하지만 JavaScript 자체에서 undefined사용되는 값입니다.

둘째, 아닙니다. 직접적으로 동등한 것은 없습니다. 에 대해 구체적으로 확인하려면 다음을 null수행하십시오.

if (yourvar === null) // Does not execute if yourvar is `undefined`

변수가 존재하는지 확인하려면 try/ 로만 수행 할 수 있습니다 . 선언되지 않은 변수와 값이 같은 것으로 선언 된 변수를 처리하기 catch때문 typeof입니다 undefined.

하지만, 변수가 선언 된 경우 확인 되지 않습니다 undefined:

if (yourvar !== undefined) // Any scope

이전 에는 변수처럼 typeof재 할당 할 수 있었으므로 연산자 를 사용하여 정의되지 않은 안전을 검사해야했습니다 undefined. 옛날 방식은 다음과 같습니다.

if (typeof yourvar !== 'undefined') // Any scope

undefined재 할당 할 수 있는 문제는 2009 년에 릴리스 된 ECMAScript 5에서 수정되었습니다. 이제 한동안 읽기 전용 이므로 사용하지 않고도 안전하게 사용 ===하고 !==테스트 할 수 있습니다 .undefinedtypeofundefined

멤버가 독립적으로 존재하지만 그 가치가 무엇인지 신경 쓰지 않으려면 다음을 수행하십시오.

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

변수가 진실 인지 알고 싶다면 :

if (yourvar)

출처


71
undefined는 예약어가 아닙니다. 당신 (또는 다른 사람의 코드)은 "undefined = 3"을 수행 할 수 있으며 두 가지 테스트를 중단합니다.
Jason S

6
"변수가 존재하지만 값이 저장되어 있는지 모른다면"-응?
Jason S

36
나는 그가 할당되지 않은 선언 된 변수를 언급하고 있다고 생각합니다. 예 : var foo; // foo는 존재하지만 값이 없습니다
Wally Lawless

3
흠 ... 방금 "소스"링크를 발견했습니다.이 전체 게시물은 메일 링리스트에서 직접 인용 한 것이며 원본 작성자가 명확히 할 수 없으므로 더 명확하게 편집해야합니다.
Jason S

11
"JavaScript에서 null은 객체입니다.", 그것은 사실이 아니며 아마도이 오해의 원인은 typeof연산자 ( typeof null == 'object') 일 것입니다. null A는 프리미티브 값 의 유일한 값, 널 타입 .
CMS

347

변수가 실제로 있는지 테스트하는 유일한 방법 undefined은 다음을 수행하는 것입니다. undefined는 JavaScript의 객체입니다.

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}

이 스레드의 다른 솔루션 중 일부는 변수가 정의되어 있어도 (예 : NULL 또는 0의 값으로) 정의되지 않았다고 생각하게합니다.


18
질문이 정의되지 않았으므로 여기에 someVar! == 'undefined'유형이어야합니다.
eomeroff

1
정말, 나는 undefinded 개체, 체크 문서 처음이라고 그렇게 생각하지 않습니다 developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
Nicramus

2
을 생성하지 않는 유일한 테스트입니다 ReferenceError.
Nostalg.io

2
이 코드는 정확하지만 undefined자바 스크립트의 객체는 잘못된 정보 라고 생각 합니다. 이 진술은 어쨌든 귀하의 답변과 관련이 있습니까? 이름이 전역 식별자에 지정된 undefined유형 의 값 입니다 . undefinedundefined
SimplGy

1
이것이 유일한 방법이라는 점에서 이제 잘못되었습니다. undefinedES5 이후로 읽기 전용입니다. 다음 if (x === undefined) {...}과 같이 속기를 사용 하거나 사용하여 정의되지 않은 테스트를 안전하게 테스트 할 수 있습니다 if (x === void 0).
스티븐 M 어빙

66

기술적으로 올바른 해결책은 다음과 같습니다.

typeof x === "undefined"

때로는 게으르고 사용할 수 있습니다

x == null

그러나 정의되지 않은 변수 x와 null을 포함하는 변수 x가 모두 true를 반환하도록 허용합니다.


1
당신이 입력하면 var x;다음 과 같은 방식으로 typeof x;얻을 수 "undefined"있습니다typeof lakjdflkdsjflsj;
Muhammad Umer

정의되지 않았지만 선언 된 변수를 확인할 수있는 방법이 없습니까?
Muhammad Umer

1
나는 그렇게 생각하지 않는다. 왜 당신이 원하는지 잘 모르겠습니다.
Jason S

ujndefined는 정점 사이에 있지 않아야합니다
LowFieldTheory

정점이란 무엇입니까?
Jason S

19

더 쉽고 짧은 축약 형은 다음과 같습니다.

if (!x) {
   //Undefined
}

또는

if (typeof x !== "undefined") {
    //Do something since x is defined.
}

26
x가 함수 호출에서 설정되는 경우 첫 번째 코드는 올바르지 않을 수 있습니다. x = A ()와 같음; A가 아무 것도 반환하지 않으면 기본적으로 "정의되지 않음"을 반환합니다. ! x를하는 것은 논리적으로 정확할 것입니다. 그러나 A ()가 0을 반환하면! x는 x = 0과 같이 거짓이어야합니다. 그러나 JS에서는! 0도 마찬가지입니다.
Rajat

두 번째 코드는 다음과 같이 단축 될 수 있습니다 : if (! typeof (XX)) {...} else {...}
Alejandro Silva

2
@AlejandroSilva 늦게 답변해서 죄송합니다. typeof가 문자열을 반환하기 때문에 작동하지 않으므로 정의되지 않은 변수에 대해 '정의되지 않음'을 반환하고 결과적으로 TRUE로 평가되므로 정의 된 var의 오 탐지가 발생합니다.
Dmitri Farkov

5
첫 번째 스 니펫을 제거하십시오. 아주 나쁩니다
Juan Mendes

1
다른 의견들은 첫 번째 예가 나쁘지만 그 이유는 분명하지 않다고 지적했다. 따라서 새로운 코더의 경우! x는 x가 정의되어 있는지 여부를 테스트하지 않지만 진실인지 테스트합니다. 문자열, 부울 true 및 양수는 모두 진실이며 (일부 잊어 버릴 수도 있습니다) 0, 부울 false 및 빈 문자열과 같은 잠재적으로 유효한 다른 값은 사실이 아닙니다. 첫 번째 예제는 특정 유스 케이스 (예 : 정의되지 않은 것과 동일하게 비어 처리 할 수있는 문자열 테스트)에서 작동 할 수 있지만 그렇지 않은 곳이 많기 때문에 기본 확인 방법으로 간주해서는 안됩니다.
cfc

16

나는 종종 했어요 :

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}

9
"=="를 "==="로 변경하십시오. doSomething (null)을 호출하면 경고가 표시됩니다. 그것이 당신이 원하는 것이 아니라면.
Jason S

네. 당신은 당신이 동등하거나 정확하게 동등한 것을 결정해야합니다. 어느 경우 든 사용할 수 있습니다.
Joe

1
만약 (! 여기서 variableName 대해서 typeof == '정의되지 않은')> this- 같은 검사를 simplye {경고 (여기서 variableName);}
무하마드 사 디크

어쨌든 정의되지 않은 var를 함수에 전달할 수 없기 때문에 이것은 쓸모가 없습니다
avalanche1

2
물론 넌 할 수있어. 인수없이 함수를 호출하십시오.
Joe

3

삼항 조건 연산자를 사용할 수도 있습니다.

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);


만약에 var a = false;? 당신은 확인해야하는 경우 a===undefined대신
ITER ATOR

1
질문 : 정의되지 않은 변수 확인 ..... 이것은 정의되지 않은 변수입니다 : var x; 위의 작업을 수행하면 오류가 발생합니다
Muhammad Umer

"a = false 인 경우"i dont know 'a' ""로 표시됩니다. 문제입니다. 문제는 그것이 사실인지 아닌지 정의되어 있는지 테스트하는 것입니다. a가 false로 정의되면 a는 정의되지 않습니다. 이 경우 잘못된 결과가 반환됩니다. 이 방법이 작동하지 않는 이유에 대한 자세한 내용 은 stackoverflow.com/a/858270/2055492에 대한 내 의견을 참조하십시오 .
cfc

!a대해 true를 테스트 undefined할뿐만 아니라 0and null및에 대해서도 true를 테스트합니다 false. 이것은 매우 올바르지 않으므로 제거해야합니다.
스티븐 M 어빙

2

나는 종종 가장 간단한 방법을 사용합니다.

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

편집하다:

변수를 초기화하지 않으면 "Uncaught ReferenceError : variable is not defined ..."예외가 발생합니다.


2
Uncaught ReferenceError: variable is not defined
Muhammad Umer

@MuhammadUmer, 잘못되었습니다! variable에 의해 정의됩니다 var variable;. 이 스 니펫은 variable로컬 범위에서 재정의 됩니다. 클로저 또는 전역 변수에 액세스 할 것으로 예상되는 논리를 깨뜨릴 수 있습니다. 즉 :var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
Евгений Савичев

2

또 다른 잠재적 인 "솔루션"은 window객체 를 사용하는 것입니다. 브라우저에있을 때 참조 오류 문제를 피합니다.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}

이것은 원래의 질문을 전혀 해결하지 못하며 완전히 관련이 없습니다. 포스터는 어떤 것이 진실인지 거짓인지 테스트하는 방법을 묻지 않고 테스트 방법을 물었습니다 undefined. 그렇지 않습니다.
스티븐 M 어빙

2

x존재하지 않는 오류는 오류입니다 ! 값 이 지정 되지 않은으로 선언 되지 않았습니다 .

var x; // declaration
x = 2; // assignment

을 선언 x하면 오류가 발생하지 않습니다. 존재 / 선언 되었으나 값이 지정되지 undefined않았기 때문에 경고 x가 표시됩니다.

변수가 선언되었는지 확인하려면을 사용할 수 있습니다 typeof. 변수가 있는지 확인하는 다른 방법은 처음에 얻은 것과 동일한 오류를 발생시킵니다.

if(typeof x  !==  "undefined") {
    alert(x);
}

에 저장된 값의 유형을 확인하고 x있습니다. 그것은 단지 반환 undefined할 때 x이 경우 선언되지 않았거나 있다 선언 아직 할당되지 않았습니다.


ES5 (2009 릴리스) 이후 undefined가 읽기 전용이므로 더 이상 typeof연산자 가 필요하지 않습니다 .
스티븐 M 어빙

2

void운영자 반환 undefined, 인수 / 표현은 전달. 결과에 대해 테스트 할 수 있습니다 (실제로 일부 축소 프로그램은 코드를 undefined에서void 0 문자의 몇 가지를 저장)

예를 들면 다음과 같습니다.

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}

딩딩! 이것이 정답입니다. 부끄러운 줄 아세요. 모든 사람들이 여전히 사용에 매료되어 typeof사고 undefined를 재 할당 할 수 있으며, 약 10 년 동안 가능하지 않았습니다.
스티븐 M 어빙

이것은 심지어 ES5 이전에도 안전했습니다. 왜냐하면 당신이 다시 할당하더라도 undefined, 하나님은 어떤 이유 만 알기 때문에 사용 void 0은 항상 undefined상관없이 돌아올 것 입니다.
Stephen M 어빙

1

undefined아래와 같이 확인할 수 있습니다

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}

1

다음과 같이하십시오.

function isNotDefined(value) {
  return typeof value === "undefined";
}

다음과 같이 호출하십시오.

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false

0

허용 된 답변이 맞습니다. 옵션을 하나 더 추가하고 싶었습니다. try ... catch블록을 사용하여이 상황을 처리 할 수도 있습니다 . 이상한 예 :

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

catch블록 수준 범위를 생성하므로 약간 지저분한 블록을 알고 있어야 합니다. 물론 예는 질문에 대답하기 위해 매우 단순화되어 있으며 오류 처리의 모범 사례는 다루지 않습니다.


0

작은 함수를 사용하여 변수가 선언되었는지 확인하여 실제로 자바 스크립트 파일의 혼란을 줄입니다. 변수의 존재 여부뿐만 아니라 값이 할당되었는지 확인하기 위해 값 검사를 추가합니다. 두 번째 조건은 변수가 인스턴스화되었는지 여부를 확인합니다. 변수가 정의되었지만 인스턴스화되지 않은 경우 (아래 예 참조) 코드에서 값을 참조하려고하면 여전히 오류가 발생합니다.

인스턴스화되지 않음- var my_variable;인스턴스화 됨-var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

그런 다음 조건문을 사용하여 변수가 다음과 같이 정의되고 인스턴스화되었는지 테스트 할 수 있습니다.

if ( varExists(variable_name) ) { // checks that it DOES exist } 

또는 정의되고 인스턴스화되지 않은지 테스트하기 위해 ...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }

1
술어를 즉시 돌려 보내지 않겠습니까? return typeof el !== "undefined" && typeof el.val() !== "undefined"
skubski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.