JavaScript에서 정의되지 않거나 null 변수를 확인하는 방법은 무엇입니까?


500

JavaScript 코드에서 다음 코드 패턴을 자주 사용하고 있습니다

if (typeof(some_variable) != 'undefined' && some_variable != null)
{
    // Do something with some_variable
}

같은 효과를주는 덜 장황한 검사 방법이 있습니까?

일부 포럼 및 문헌에 따르면 단순히 다음과 같은 효과가 있어야한다고 말합니다.

if (some_variable)
{
    // Do something with some_variable
}

불행히도 Firebugsome_variable 는 정의되지 않은 런타임에 이러한 문을 오류로 평가 하지만 첫 번째 문은 괜찮습니다. 이것이 Firebug의 (원치 않는) 동작입니까? 아니면 두 가지 방법 사이에 실제로 약간의 차이가 있습니까?


46
if(some_variable) { ... }some_variableis falseor 0or ... 인 경우 실행되지 않습니다 .
kennytm

good point;) 그러나 그것이 거짓이나 0이 될 수 없다는 것을 알고 있고 어떤 논리 (문자열, 배열 등)로 사용할 수 있는지 확인하고 싶다
Tomas Vana


2
... 또는 빈 문자열.
David 주어진

답변:


333

사례를 구별해야합니다.

  1. 변수는 선언undefined 되거나 선언되지 않을 수 있습니다 . 이외의 컨텍스트에서 선언되지 않은 변수에 액세스하면 오류가 발생합니다 typeof.
if(typeof someUndeclaredVar == whatever) // works
if(someUndeclaredVar) // throws error

선언되었지만 초기화되지 않은 변수는 undefined입니다.

let foo;
if (foo) //evaluates to false because foo === undefined
  1. 같은 정의되지 않은 속성someExistingObj.someUndefProperty . 정의되지 않은 속성은 오류를 생성하지 않고 단순히을 반환 undefined하며,이를 부울로 변환하면로 평가됩니다 false. 따라서 0및에 신경 쓰지 않으면 false사용하는 if(obj.undefProp)것이 좋습니다. 이 사실에 근거한 일반적인 관용구가 있습니다.

    value = obj.prop || defaultValue

    이는 " obj속성이있는 경우 속성 prop을 할당하고 value그렇지 않으면 기본값을 할당합니다 defautValue"를 의미합니다.

    어떤 사람들은이 동작을 혼란스럽게 생각하여 찾기 어려운 오류가 발생하고 in대신 연산자를 사용하는 것이 좋습니다

    value = ('prop' in obj) ? obj.prop : defaultValue

1
그런 다음 hasOwnProperty 및 프로토 타입에 대해 이야기 할 수 있습니다. [] 내의 '같이 IndexOf'== [] .hasOwnProperty ( '같이 IndexOf')!
Alsciende

1
예, 나는 이것을 추가하는 것에 대해 생각했지만 간결성을 위해 완전성을 희생하기로 결정했습니다. ;)
user187291

52
당신은 0과 거짓의 문제를 다루지 않습니다
TMS

12
선언되지 않은 변수를 의미 합니다. 변수를 선언 할 수는 있지만 여전히 값은 undefined입니다.
Tgr

1
또한 typeof문자열 을 반환합니다. 따라서 not을 var myVar; typeof(myVar)==undefined반환합니다 . falsetrue
rism

417

"가치 null또는 undefined" 를 테스트하는 가장 효율적인 방법 은

if ( some_variable == null ){
  // some_variable is either null or undefined
}

따라서이 두 줄은 동일합니다.

if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}

참고 1

질문에서 언급했듯이 짧은 변형 some_variable이 선언되어 있어야합니다 . 그렇지 않으면 ReferenceError가 발생합니다. 그러나 많은 유스 케이스에서 이것이 안전하다고 가정 할 수 있습니다.

선택적 인수를 확인하십시오.

function(foo){
    if( foo == null ) {...}

기존 객체의 속성 확인

if(my_obj.foo == null) {...}

반면에 typeof선언되지 않은 전역 변수 (간단히 반환 undefined)를 처리 할 수 ​​있습니다 . 그러나 Alsciende가 설명했듯이 이러한 경우는 적절한 이유로 최소로 줄여야합니다.

노트 2

이보다 더 짧은 변종은 동일 하지 않습니다 .

if ( !some_variable ) {
  // some_variable is either null, undefined, 0, NaN, false, or an empty string
}

그래서

if ( some_variable ) {
  // we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}

노트 3

일반적으로 ===대신에 사용 하는 것이 좋습니다 ==. 제안 된 솔루션은이 규칙의 예외입니다. JSHint 문법 검사기 도 제공 eqnull이 이유에 대한 옵션을 선택합니다.

로부터 의 jQuery 스타일 가이드 :

엄격한 평등 검사 (===)는 ==에 유리하게 사용해야합니다. null을 통해 undefined 및 null을 검사 할 때는 예외입니다.

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;

1
매우 중요한 차이점 (btw 질문에서 이미 언급). 모두가 typeof를 사용하는 이유입니다. 미안하지만 대답이 유용한 곳을 얻지 못합니다. 질문에서 말한 것을 말하고 처음 몇 줄에는 잘못 표시합니다.
TMS

33
죄송하지만, 동의하지 않습니다 ;-) 사용 == null은 'null 또는 undefined'(질문 주제)를 테스트하는 데 가장 효율적입니다. 변수가 선언되었다는 것을 자주 알거나 또는와 같은 기존 객체의 속성을 테스트하기 때문에 드문 일이 아닙니다 (jQuery 1.9.1에서 43 번 사용) if( o.foo == null).
mar10

1
@ mar10 (aUndefinedVar == null)은 "aUndefinedVar is not defined"오류가 아니라는 것을 나타냅니다.
Rannnn

7
간결한 옵션에 감사드립니다. 내 코드의 99 %에서 null과 undefined를 구분할 필요가 없으므로이 검사의 간결성으로 인해 코드가 덜 어려워집니다.
Ian Lovejoy

1
전역 변수를 확인할 때 ReferenceError를 방지하려면을 사용하십시오 window.someProperty == null. 지역 변수의 경우, 변수가 선언되었는지 쉽게 확인할 수 있습니다. if (...) {var local = ""}쓰기 대신var local; if (...) { local = ""; }
Aloso

66

정상 동등성을 가진 null을 검사하면 undefined에 대해서도 true를 반환합니다.

if (window.variable == null) alert('variable is null or undefined');

JS 평등


4
NaN이 Nan과 같지 않습니까?
Sharjeel Ahmed

2
@monotheist NaN은 NaN과 다릅니다 ( MDN의 NaN 페이지 참조 ). Javascript는이 동작을 지정하는 부동 소수점에 IEEE-754를 사용합니다. 이에 대한 몇 가지 생각이 있습니다. stackoverflow.com/a/23666623/2563765
Steven

1
@SharjeelAhmed 수학적으로 수정되었습니다. NaN차이 방정식으로부터 결코 같을 것으로 예상 할 수 없음
Thaina

28

ES5 및 ES6와 같은 최신 JavaScript 표준에서는 다음과 같이 말할 수 있습니다.

> Boolean(0) //false
> Boolean(null)  //false
> Boolean(undefined) //false

모두 false를 반환하는데, 이는 빈 변수에 대한 파이썬의 검사와 유사합니다. 따라서 변수 주위에 조건부 논리를 작성하려면 다음과 같이 말하십시오.

if (Boolean(myvar)){
   // Do something
}

여기서 "null"또는 "empty string"또는 "undefined"는 효율적으로 처리됩니다.


2
ie5와 같이 지원되는 이유는 무엇입니까?
히메 이터

12
영업 이익 만 원 테스트 다른 nullundefined, 다른 falsy 값이 true를 돌려!
Andre Figueiredo

1
조건부에는 값을 추가하지 않습니다. 조건은 정확히 동일하게 평가되고 0,에 대해 여전히 false를 반환합니다 NaN. 객체에 대한 참조를 유지하지 않고 객체의 진실성을 캡처하여 잠재적으로 큰 객체가 아닌 객체를 저장할 수 있습니다. 참고로 이는 !!value첫 번째 !가 진실성을 부정하고 두 번째가 다시 그것을 부정하는 것과 같습니다 .
erich2k8

> 참고로 이것은 또한 !! value와 동일합니다. 진실성을 부정합니다. 어떤 FYI도 if (var)부울로 캐스트 될 것이므로, 기본적으로 완전히 쓸모가 없습니다 ...
Cyril CHAPON

2
말 그대로 키워드를 사용하는 동안 정의되지 않은 , Boolean(undefined)노력하고, 작품을 그 정의되지 않은으로 변수를 하지 않는 일을, 그리고 그 null 또는 정의되지 않은에 대한 검사를 수행하는 전체 지점입니다. :이 if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }: "undeclareVarName 정의되지 않은 ReferenceError가가"라는 ReferenceError가 발생합니다
스티븐 P

22

선언되지 않은 변수를 참조하려고하면 모든 JavaScript 구현에서 오류가 발생합니다.

객체의 속성은 동일한 조건이 적용되지 않습니다. 객체 속성이 정의되지 않은 경우 액세스하여 액세스해도 오류가 발생하지 않습니다. 따라서이 상황에서 다음을 줄일 수 있습니다.

 if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)

if (myObj.some_property != null)

이를 염두에두고 전역 변수를 전역 객체의 속성으로 액세스 할 수 있다는 사실 ( window브라우저의 경우)을 사용하면 전역 변수에 다음을 사용할 수 있습니다.

if (window.some_variable != null) {
    // Do something with some_variable
}

로컬 범위에서는 변수가 코드 블록의 맨 위에 선언되어 있는지 확인하는 것이 항상 유용합니다. 이는 반복 사용시 절약됩니다 typeof.


11
NaN, 0, ""및 false 원인은 null 또는 undefined가 아니라 false입니다.
Andreas Köberle

@Andreas Köberle이 맞습니다. 엄격하지 않은 항등 연산자조차도 null이 NaN, 0, ""및 false와 다르다고 말합니다. if (myObj.some_property != null)동등한 행동 을 취해야 합니다.
thejoshwolfe

15

먼저 테스트 대상에 대해 명확해야합니다. 자바 스크립트는 당신을 여행하는 암시 적 변환의 모든 종류를 가지고 있으며, 평등 비교기의 두 가지 유형 : =====.

다음 특성 test(val)을 테스트 null하거나 undefined가져야 하는 기능 :

 test(null)         => true
 test(undefined)    => true
 test(0)            => false
 test(1)            => false
 test(true)         => false
 test(false)        => false
 test('s')          => false
 test([])           => false

여기서 어떤 아이디어가 실제로 테스트를 통과했는지 봅시다.

이 작품들 :

val == null
val === null || val === undefined
typeof(val) == 'undefined' || val == null
typeof(val) === 'undefined' || val === null

이들은 작동하지 않습니다 :

typeof(val) === 'undefined'
!!val

이 접근법 의 정확성과 성능을 비교하기 위해 jsperf 항목을 만들었습니다 . 다른 브라우저 / 플랫폼에서 실행이 충분하지 않아서 결과는 당분간 결정적이지 않습니다. 컴퓨터에서 테스트를 실행하려면 잠시 시간을 내십시오!

현재 간단한 val == null테스트가 최상의 성능을 제공하는 것으로 보입니다 . 또한 가장 짧습니다. val != null보완을 원하면 테스트가 무효화 될 수 있습니다 .


12

이것은 ==사용해야 하는 유일한 경우입니다 .

if (val == null) console.log('val is null or undefined')

3
2019 년경 에이 대답은 공감력이 부족하지만이 유스 케이스의 KISS 답변입니다. 또한 val != null반대의 경우 단 하나 = 이며 @Yukulele 당 하나만 사용 ==하므로 볼 때 수행되는 작업을 알 수 있습니다.
DKebler

7

하나의 완전하고 정확한 답변이 없으므로 요약하려고합니다.

일반적으로 표현은 다음과 같습니다.

if (typeof(variable) != "undefined" && variable != null)

variable선언하지 않으면 typeof(variable) != "undefined"ReferenceError가 발생 하기 때문에 단순화 할 수 없습니다 . 그러나 상황에 따라 표현을 단순화 할 수 있습니다 .

variable전역 인 경우 다음과 같이 단순화 할 수 있습니다.

if (window.variable != null)

이 경우 지역 ,이 변수가 선언되지 않은 경우 아마 상황을 방지하고, 또한으로 단순화 할 수 있습니다 :

if (variable != null)

그것이 object property 인 경우 ReferenceError에 대해 걱정할 필요가 없습니다.

if (obj.property != null)

navigator일부 window입니까? 에 대한 예외가 발생 navigator is not defined하면 window.navigator != null테스트를 사용할 수 있습니까?
jww

5

변수에 값이 있는지 여부를 확인할 수 있습니다. 의미,

if( myVariable ) {
//mayVariable is not :
//null
//undefined
//NaN
//empty string ("")
//0
//false

}

변수가 존재하는지 여부를 알 수없는 경우 (즉, 선언 된 경우) typeof 연산자로 확인해야합니다. 예 :

if( typeof myVariable !== 'undefined' ) {
    // myVariable will get resolved and it is defined
}

4

이 방법을 사용 하여이 작업을 수행했습니다.

id를 변수에 저장하십시오

var someVariable = document.getElementById("someId");

그런 다음 if 조건을 사용하십시오.

if(someVariable === ""){
 //logic
} else if(someVariable !== ""){
 //logic
}

3

답변 중 하나에서 언급했듯이 전역 범위가있는 변수에 대해 이야기하고 있다면 운이 좋을 수 있습니다. 아시다시피 전역 적으로 정의한 변수는 windows 객체에 추가되는 경향이 있습니다. 이 사실을 활용할 수 있으므로 bleh라는 변수에 액세스한다고 가정하고 이중 반전 연산자 (!!)를 사용하십시오.

!!window['bleh'];

bleh가 선언되지 않고 값이 할당 된 동안 이것은 false를 리턴합니다.



3

이것은 ==대신 사용 하는 것이 매우 드문 경우의 예 입니다 ===. Expression somevar == nullundefinedand null에 대해 true를 반환 하지만 다른 모든 것에 대해서는 false를 반환합니다 (변수가 선언되지 않은 경우 오류).

를 사용하면 !=예상대로 결과가 반전됩니다.

현대의 편집자 는 거의 항상 원하는 동작이므로 with ==또는 !=연산자 를 사용하여 경고하지 않습니다 null.

가장 일반적인 비교 :

undeffinedVar == null     // true
obj.undefinedProp == null // true
null == null              // true
0 == null                 // false
'0' == null               // false
'' == null                // false

직접 해보십시오.

let undefinedVar;
console.table([
    { test : undefinedVar,     result: undefinedVar     == null },
    { test : {}.undefinedProp, result: {}.undefinedProp == null },
    { test : null,             result: null             == null },
    { test : false,            result: false            == null },
    { test : 0,                result: 0                == null },
    { test : '',               result: ''               == null },
    { test : '0',              result: '0'              == null },
]);

2

어떤 YYY는 정의되지는 null, 그것은 true를 돌려줍니다

if (typeof yyy == 'undefined' || !yyy) {
    console.log('yes');
} else {
    console.log('no');
}

if (!(typeof yyy == 'undefined' || !yyy)) {
    console.log('yes');
} else {
    console.log('no');
}

아니


2

브라우저에서 개발자 도구 를 열고 아래 이미지에 표시된 코드를 사용해보십시오.

Img1 Img2


2

이해하기 위해 undefined, null 및 ''(빈 문자열도)를 변환 할 때 Javascript 엔진에서 반환되는 값을 분석해 보겠습니다. 개발자 콘솔에서 직접 확인할 수 있습니다.

여기에 이미지 설명을 입력하십시오

모든 것이 false로 변환되는 것을 볼 수 있습니다.이 세 가지 모두는 자바 스크립트에 의해 '존재가 없다'고 가정합니다. 따라서 코드에서 세 가지를 모두 명시 적으로 확인할 필요가 없습니다.

if (a === undefined || a === null || a==='') {
    console.log("Nothing");
} else {
    console.log("Something");
}

또한 한 가지 더 지적하고 싶습니다.

Boolean (0)의 결과는 무엇입니까?

물론 거짓입니다. 0이 예상 결과에 유효한 값이면 코드에 버그가 발생합니다. 따라서 코드를 작성할 때이를 확인하십시오.


2

당신이 가진 것과 비슷하게, 당신은 같은 것을 할 수 있습니다

if (some_variable === undefined || some_variable === null) { do stuff }


0

nullity ( if (value == null)) 또는 non-nullity ( if (value != null)) 테스트는 변수의 정의 상태를 테스트하는 것보다 덜 장황합니다.

또한 부울 값으로 정의 된 변수 (또는 객체 속성)가 있는지 확인하기위한 테스트 if (value)(또는 if( obj.property))가 실패 false합니다. 주의 사항 :)


0

엄격한 비교 연산자를 사용하여 두 값을 쉽게 구별 할 수 있습니다.

실무 예제 :

http://www.thesstech.com/tryme?filename=nullandundefined

샘플 코드 :

function compare(){
    var a = null; //variable assigned null value
    var b;  // undefined
    if (a === b){
        document.write("a and b have same datatype.");
    }
    else{
        document.write("a and b have different datatype.");
    }   
}

0

은 if 문의 목적을 확인하는 경우 null또는 undefined변수에 값을 할당하기 전에 값, 당신이 사용할 수 Nullish 합체 운영자 브라우저 지원이 제한되어 있지만, 자바 스크립트가 마지막으로 사용할 수 있습니다. caniuse 의 데이터에 따르면 , 2020 년 4 월 기준으로 브라우저의 48.34 % 만 지원됩니다.

const a = some_variable ?? '';

그러면 변수가 some_variableis null또는 인 경우 빈 문자열 (또는 다른 기본값)에 할당됩니다 undefined.

이 연산자는 0and와 같은 다른 유형의 허위 값에 대한 기본값을 반환하지 않기 때문에 사용 사례에 가장 적합합니다 ''.


-1

이 형식의 기능을 정의해야합니다.

validate = function(some_variable){
    return(typeof(some_variable) != 'undefined' && some_variable != null)
}

변수가 선언되지 않으면 동일한 ReferenceError가 생성됩니다.
Chad

-1

ES5 또는 ES6에서 여러 번 확인해야 할 경우 수행 할 수있는 작업은 다음과 같습니다.

const excluded = [null, undefined, ''];

if (!exluded.includes(varToCheck) {
  // it will bee not null, not undefined and not void string
}


-1

Ramda를 사용하면 R.isNil(yourValue) Lodash 를 수행 할 수 있으며 다른 헬퍼 라이브러리는 동일한 기능을 갖습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.