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의 (원치 않는) 동작입니까? 아니면 두 가지 방법 사이에 실제로 약간의 차이가 있습니까?
답변
사례를 구별해야합니다.
- 변수는 선언
undefined
되거나 선언되지 않을 수 있습니다 . 이외의 컨텍스트에서 선언되지 않은 변수에 액세스하면 오류가 발생합니다typeof
.
if(typeof someUndeclaredVar == whatever) // works
if(someUndeclaredVar) // throws error
선언되었지만 초기화되지 않은 변수는 undefined
입니다.
let foo;
if (foo) //evaluates to false because foo === undefined
-
같은 정의되지 않은 속성
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
답변
“가치 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;
답변
정상 동등성을 가진 null을 검사하면 undefined에 대해서도 true를 반환합니다.
if (window.variable == null) alert('variable is null or undefined');
답변
ES5 및 ES6와 같은 최신 JavaScript 표준에서는 다음과 같이 말할 수 있습니다.
> Boolean(0) //false
> Boolean(null) //false
> Boolean(undefined) //false
모두 false를 반환하는데, 이는 빈 변수에 대한 파이썬의 검사와 유사합니다. 따라서 변수 주위에 조건부 논리를 작성하려면 다음과 같이 말하십시오.
if (Boolean(myvar)){
// Do something
}
여기서 “null”또는 “empty string”또는 “undefined”는 효율적으로 처리됩니다.
답변
선언되지 않은 변수를 참조하려고하면 모든 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
.
답변
먼저 테스트 대상에 대해 명확해야합니다. 자바 스크립트는 당신을 여행하는 암시 적 변환의 모든 종류를 가지고 있으며, 평등 비교기의 두 가지 유형 : ==
와 ===
.
다음 특성 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
보완을 원하면 테스트가 무효화 될 수 있습니다 .
답변
이것은 ==
사용해야 하는 유일한 경우입니다 .
if (val == null) console.log('val is null or undefined')