자바 스크립트 null 확인


170

다음 코드를 보았습니다.

function test(data) {
    if (data != null && data !== undefined) {
        // some code here
    }
}

JavaScript를 처음 접했지만 여기에서 읽은 다른 질문에서이 코드가 의미가 없다는 인상을 받았습니다.


특히이 답변

이외의 컨텍스트에서 정의되지 않은 변수에 액세스하면 오류가 발생합니다 typeof.

업데이트 : 위 의 (따옴표) 답변이 잘못되었을 수 있습니다. «undefined variable» 대신 «declared variable» 이어야합니다 .

내가 알았 듯이 Ryan ♦ , maericsnwellnhof 의 답변 에서 함수에 인수가 제공되지 않은 경우에도 인수에 대한 변수는 항상 선언됩니다. 이 사실은 또한 아래 목록의 첫 번째 항목이 잘못되었음을 증명합니다.


내가 이해 한 바에 따르면 다음과 같은 시나리오가 발생할 수 있습니다.

  • 이 함수는 인수없이 호출되었으므로 data정의되지 않은 변수 를 만들고 에 오류가 발생했습니다 data != null.

  • 이 함수는 인수로 null(또는 undefined)으로 특별히 호출 되었습니다.이 경우 data != null이미 내부 코드를 보호하여 && data !== undefined쓸모가 없습니다.

  • 함수는 그 소소 모두 통과 할 경우에 비 - 널 인수로 불렸다 data != null data !== undefined .

Q : 이해가 정확합니까?


Firefox 콘솔에서 다음을 시도했습니다.

--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true

나는 data !== undefined data != null 가 쓸모없는 경우를 알아낼 수 없다 .


9
그냥 사용하십시오 if (data). data변수가 true로 평가 되는지 확인하는 니모닉 자바 스크립트 방법 입니다. undefined,, nullfalse, 0, 빈 문자열, 빈 배열 및 속성이없는 (?) 객체는 false로 평가되며 나머지는 true입니다.
J0HN

20
@ J0HN-를 사용하면에 또는 값을 if(data)전달할 수 없습니다 . false0data
techfoobar

@ J0HN 또한 언급 한 것과 같은 대답은 다음과 같습니다. if(typeof someUndefVar == whatever) -- works, 및 if(someUnderVar) -- error.
afsantos

2
아마 data !== null && data !== undefined이고, data != null이는에 해당합니다 data != undefined. 이 조건에 대한 자세한 명시 적의로 모두 것을 간과하기 쉬운 것입니다 반면, 이전 형태는 선호되는 경향 nullundefined이후 두 조건을 확인하고있다.
zzzzBov 2016 년

2
그건 그렇고, 명시 적 테스트 undefined는 IMO 코드 냄새입니다. 와 같은 보호 된 키워드가 아니며 null정의되지 않은 변수입니다. 이것은 완전히 유효하며 코드를 깨뜨릴 것입니다 :undefined = 1
Izkata

답변:


106

"정의되지 않은 변수"는 값과 다릅니다 undefined.

정의되지 않은 변수 :

var a;
alert(b); // ReferenceError: b is not defined

값을 가진 변수 undefined:

var a;
alert(a); // Alerts “undefined”

함수가 인수를 취할 때, 그 인수는 그 값이 undefined인 경우에도 항상 선언 되므로 오류가 없습니다. 당신 오른쪽에 대한되는 != null다음 !== undefined불구하고, 쓸모있는.


32
data !== null && data !== undefined그래도 말이됩니다.
bfavaretto

@ bfavaretto : 그렇습니다. 실제로 오타 일 수 있습니다. 그러나 당신은 모른다… : D
Ry-

1
내가 생각했던 것처럼, 설명을 해주셔서 감사합니다. 또한 오타라고 생각하지 않습니다. 나는 전체 스크립트에서 찾기 및 계산 을 실행했으며 10 건을 발견 했으므로 저자는 이것에 대한 설명이 필요하다고 생각합니다.
afsantos

2
위의 내 의견을 긁으십시오 . 실제로 and ( 그리고 흥미롭게도 다른 거짓 값이 아닌 and 만 data != null확인하십시오 ). nullundefinednullundefined
bfavaretto

90

JavaScript에서는 null"값 없음"을 알리는 데 도움이되는 특수한 단일 객체입니다. 비교하여 테스트 할 수 있으며 JavaScript에서 평소와 같이 ===유형 강제 변환을 혼동하지 않도록 연산자를 사용하는 것이 좋습니다 .

var a = null;
alert(a === null); // true

@rynah가 언급했듯이 "정의되지 않은"은 JavaScript에서 약간 혼동됩니다. 그러나 typeof(x)"x"가 선언 된 변수가 아닌 경우에도 문자열이 "정의되지 않음" 인지 테스트하는 것이 안전 합니다.

alert(typeof(x) === 'undefined'); // true

또한 변수가 초기화되지 않은 경우 "정의되지 않은 값"을 가질 수 있습니다.

var y;
alert(typeof(y) === 'undefined'); // true

모두 합치면 수표는 다음과 같아야합니다.

if ((typeof(data) !== 'undefined') && (data !== null)) {
  // ...

그러나 변수 "data"는 공식 함수 매개 변수이므로 항상 정의되므로 "typeof"연산자를 사용할 필요가 없으며 "정의되지 않은 값"과 직접 안전하게 비교할 수 있습니다.

function(data) {
  if ((data !== undefined) && (data !== null)) {
    // ...

이 스 니펫은 "함수가 정의되어 있고 널이 아닌 인수로 함수가 호출 된 경우"라고 말합니다.


5
해야 는하지만, 그 모습? != null를 제외한 모든 값에 대한 진실 것 nullundefined, 우리는이 변수가 선언되어 있는지 확인입니다. typeof다른 상황에서는 위험 할 수도 있습니다. 변수 이름을 잘못 입력하면 어떻게됩니까? 오류가 없기 때문에 오랫동안 감지되지 않을 수 있습니다.
Ry-

@maerics 따라서 위의 시나리오와 같은 null 검사에서 대답을 올바르게 따르면 !=엄격한 비교 만 사용하지 !==않습니까?
afsantos

@rynah : null 테스트가 적절한 지 아닌지를 알기 위해 OP의 전체 솔루션에 대해 충분히 알고 있다고 생각하지 않지만 "typeof"를 사용하는 것이 불필요하다는 사실을 언급하기 위해 편집했습니다.
maerics

@afsantos : 실제로 많은 (모든?) 값이 null로 변환 될 것이라고 생각하지 않습니다. 그러나 ===실제로 수행중인 작업을 알고 변환 후 비교를 원치 않는 한 엄격한 비교 ( ) 를 사용하는 것이 가장 좋습니다 ==.
maerics

1
@Izkata : 재정의하려는 라이브러리를 삭제하십시오 undefined. 또한 iPad의 Safari는 어떠한 상황에서도 그렇게하지 않습니다. 당신도 할 수 없습니다 delete window.undefined.
Ry-

10

귀하의 경우에 사용하십시오 data==null(null 및 undefined에 대해서만 참-행 / 열에 대한 두 번째 그림 초점은 null 정의되지 않음)

여기에 모든 것이 있습니다 ( src ) :

만약

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

== (그것의 부정 ! = )

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

=== (그것의 부정 ! == )

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


8

Q : 인수없이 함수가 호출되어 데이터를 정의되지 않은 변수로 만들고 데이터에 오류가 발생했습니다! = null.

A : 예, data정의되지 않았습니다. 스펙의 10.5 선언 바인딩 인스턴스화 섹션을 참조하십시오 . 그러나 정의되지 않은 값에 액세스해도 오류가 발생하지 않습니다. 엄격 모드에서 선언되지 않은 변수에 액세스하여 오류가 발생하는 것을 혼동하는 것 같습니다.

Q : 이 함수는 인수로 널 (또는 정의되지 않음)로 특별히 호출되었습니다.이 경우 data! = null은 이미 내부 코드를 보호하여 && data! == undefined undefined입니다.

Q : 이 함수는 널이 아닌 인수로 호출되었으며,이 경우 데이터! = null 및 data! == undefined를 모두 전달합니다.

A : 맞습니다. 다음 테스트는 동일합니다.

data != null
data != undefined
data !== null && data !== undefined

참조 섹션 11.9.3 추상 평등 비교 알고리즘섹션 11.9.6 엄격한 평등 비교 알고리즘 사양의합니다.


나는 선언되지 않은 변수와 혼동하지 않았으며 인수가 제공되지 않을 때 어떻게 작동했는지 알지 못했습니다. data로 설정되는 대신 전혀 존재하지 않을 것이라고 확신했습니다 undefined. 나는 설명을 고맙게 생각하며, 그 언급은 두 평등이 어떻게 작동하는지 더 잘 이해하는 데 도움이되었습니다.
afsantos

3

생각하지 않는 값에 대한 변수를 테스트하는 것은 일반적으로 좋은 생각이 아닙니다. 테스트는 금지 된 값의 블랙리스트를 작성하는 것으로 간주 할 수 있습니다. 그러나 모든 금지 된 값을 나열하는 것을 잊어 버린 경우 어떻게해야합니까? 누군가조차도 예기치 않은 값을 전달하여 코드를 해독 할 수 있습니다. 따라서 더 적절한 접근 방식은 화이트리스트와 같은 것입니다. 예상치 않은 값만 예상하고 변수를 테스트하는 것입니다. 예를 들어, 데이터 값이 문자열이 아닌 것으로 예상되는 경우 :

function (data) {
  if (data != null && data !== undefined) {
    // some code here
    // but what if data === false?
    // or data === '' - empty string?
  }
}

다음과 같이하십시오 :

function (data) {
  if (typeof data === 'string' && data.length) {
    // consume string here, it is here for sure
    // cleaner, it is obvious what type you expect
    // safer, less error prone due to implicit coercion
  } 
}

2

typeof foo === "undefined"와는 다르므로 foo === undefined혼동하지 마십시오. typeof foo === "undefined"당신이 정말로 필요한 것입니다. 또한, !==대신에 사용하십시오!=

그래서 진술은 다음과 같이 쓸 수 있습니다

function (data) {
  if (typeof data !== "undefined" && data !== null) {
    // some code here
  }
}

편집하다:

foo === undefined선언되지 않은 변수 에는 사용할 수 없습니다 .

var t1;

if(typeof t1 === "undefined")
{
  alert("cp1");
}

if(t1 === undefined)
{
  alert("cp2");
}

if(typeof t2 === "undefined")
{
  alert("cp3");
}

if(t2 === undefined) // fails as t2 is never declared
{
  alert("cp4");
}

1
좋아, 그러나이 경우 변수가 선언되었으므로 문제는 무엇입니까?
Ry-

개인적 foo === undefined으로 사용하기에 위험합니다. 예방하려는 것과 동일한 조건에서 코드가 실패합니다.

문제의 함수에 대한 논쟁에 대해 이야기하고 있습니다. 다른 의견 도 참조하십시오 .
Ry-

1
이것이 왜 다운 코팅 되는가?‽ 첫 번째 문장은 정확하고 중요한 구별입니다!
이즈 카타

1
@Izkata : 초기 진술에 대한 설명이 없기 때문에. foo === undefinedOP의 상황에서는 완벽하게 수용 가능합니다 ( undefined재정의되지 않은 것으로 가정 함 ). 대답은 또한 !== 대신에 사용해야하는지 설명하지 못한다 !=.
Matt

1

테스트를 수행하는 간단한 방법은 다음과 같습니다.

function (data) {
    if (data) { // check if null, undefined, empty ...
        // some code here
    }
}

5
이 테스트는 상황에 따라 다릅니 까? 예상되는 유형 data이 문자열 인 경우이 테스트는 빈 문자열에 대해 false를 반환하며, 적절하지 않을 수도 있습니다 (함수는 어떤 식 으로든 빈 문자열을 처리하려고 할 수 있습니다).
afsantos

5
이 경우, "데이터"을 제외한 값 보유 ""하거나 0또는 NaN(또는 다른 사람)가 "가"블록은 생략 될 것이다; OP의 의도 일 수도 있고 아닐 수도 있습니다.
maerics

죄송합니다 @afsantos, 귀하의 의견을 보지 못했습니다. 데이터가 정의되지 않은 경우 false를 원하면 null ... 날짜가 비어있는 경우를 제외하고 다른 var toTest = data 를 만들어야합니다 . : 같은 첫 번째 후 다른 테스트와 (toTest == "") {// 여기에 몇 가지 코드} 경우
Kadiri

-5
var a;
alert(a); //Value is undefined

var b = "Volvo"; 
alert(b); //Value is Volvo

var c = null;
alert(c); //Value is null

4
이것이 의미하는 바에 대한 설명을 추가하십시오.
Ry-

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