2010-12-05 8 views
8

에서 정의되지 않은 수이 코드널 (null)에 대한 검사/자바 스크립트

안전이 코드로 리팩토링 할

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

if (foo != null) { } 

똑같은가요? (그렇지 않다면 어떻게 다릅니 까?)

+0

의 중복 가능성 HTTP ://stackoverflow.com/questions/801032/null-object-in-javascript – Hps

+0

@Hps 그래서 검색했습니다. 이 질문은 한번도 묻지 않았습니다. –

답변

11

정말로. foo이 선언되지 않은 경우 두 번째 예제에서 ReferenceError 예외가 발생합니다.

한편, 정의되지 않은 선언되지 않은 변수는 typeof 연산자로 안전하게 검사 할 수 있습니다.

+0

@Daniel 이해가 안됩니다. 'var foo; '를 가지고 두 번째 스 니펫을 실행하면 오류가 발생하지 않습니다 (적어도 Chrome에는 포함되지 않음). –

+0

@Sime :'var aNewFoo;'를 선언하지 않고'if (aNewFoo! = null) {}'을 시도하십시오. 그런 다음 변수를 선언하지 않고'if (typeof aNewFoo! = 'undefined') {}'를 다시 시도하십시오. 이것이 차이점입니다. –

+0

@Daniel Aha,'foo'가 선언되지 않았다면 에러가 던져지며, 선언되었지만 정의되지 않은 값을 가지고있을 경우 에러가 발생하지 않습니다. 옳은? –

2

간단한 실험은이 질문에 대답합니다 :

if(foo != null) { 
    alert('foo not null'); 
} 

위의 예는 여러 브라우저에서 자바 스크립트 오류를 ​​얻을 : "ReferenceError: Can't find variable: foo". 이는 이전에 인수로 선언되지 않은 변수 또는 var을 현재 범위에 사용했기 때문입니다.

typeof 운영자는, 다른 한편으로는, 정의되지 않은 변수에 대한 명시적인 숙박 시설을 만든다 - 그렇게, 'undefined' 반환 예상

if(typeof foo != 'undefined') { 
    alert('foo is not defined'); 
} 

작품으로.

그래서 대답은 "아니오"이다 - 그들은 같은 것이 아니다 - 일부 자바 스크립트 환경은 동일한 방식으로 작동 할 수 있지만, 다른 환경 두 번째 형태로 오류가 발생합니다 foo이없는 경우 한정된.

2

변수는 실제로 변수가 할당되지 않은 경우 기본값 인 undefined 값을 보유 할 수 있습니다. 따라서 변수가 var을 사용하여 선언되거나 할당을 통해 값이 지정되면 작동하지만 그렇지 않은 경우 ReferenceError를 얻습니다. 따라서 두 코드 조각은 이 아니며과 같습니다.

당신이 foo 선언 확신 할 수 있다면, 이것은 가정, 안전하고 원래의 두 번째 조각보다 이해하기 쉽게 undefined = 42 같은 코드 뭔가가 존재 어디에서 그 :

if(foo !== undefined && foo !== null) { } 
+0

그래서'foo'가 ('var foo;'에서와 같이) 선언 되었다면, 두 개의 스 니펫은 동일합니다. 그러나'foo'가 선언되지 않았다면 두 번째 스 니펫은 오류를 던지기 때문에 두 개의 스 니펫은 같지 않습니다. 옳은? –

+0

@ Šime Vidas : 제가 말할 수있는 한, 그렇습니다. 여전히 원래 스 니펫이 더 좋다고 생각합니다. 왜냐하면 원래 스 니펫은 그것이하는 일이 더 명확하기 때문입니다. Douglas Crockford의 JavaScript에서 인용하기 : 좋은 부분 : "악의 쌍둥이는 피연산자가 같은 유형 일 때 올바른 행동을하지만, 유형이 다르면 가치를 강요하려고 시도합니다. 복잡하고 기억할 여지가 없다. " – PleaseStand

+0

예, 첫 번째 스 니펫이 이동 방법입니다. 그 체크를 단순화 할 수 있다고 생각했는데 (null == 자바 스크립트에서 정의되지 않았기 때문에),하지만 그럴 수 없다는 것이 밝혀졌습니다. –

관련 문제