[javascript] 자바 스크립트 null 확인

다음 코드를 보았습니다.

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 가 쓸모없는 경우를 알아낼 수 없다 .



답변

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

정의되지 않은 변수 :

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

값을 가진 변수 undefined:

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

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


답변

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)) {
    // ...

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


답변

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

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

만약

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

== (그것의 부정 ! = )

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

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

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


답변

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 엄격한 평등 비교 알고리즘 사양의합니다.


답변

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

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
  }
}


답변

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");
}


답변

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

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