IT

JavaScript에서 "정의되지 않음"을 확인하려면 어떻게 해야 합니까?

itgroup 2023. 2. 6. 23:23
반응형

JavaScript에서 "정의되지 않음"을 확인하려면 어떻게 해야 합니까?

JavaScript에서 변수가 정의되지 않은 경우 테스트하는 가장 적절한 방법은 무엇입니까?

저는 몇 가지 가능한 방법을 보았습니다.

if (window.myVariable)

또는

if (typeof(myVariable) != "undefined")

또는

if (myVariable) // This throws an error if undefined. Should this be in Try/Catch?

변수가 되었는지 여부를 하려면 을 하십시오.in이치노하다

// global scope
var theFu; // theFu has been declared, but its value is undefined
typeof theFu; // "undefined"

그러나 변수 또는 속성이 선언되었지만 초기화되지 않았기 때문에 의도된 결과가 아닐 수 있습니다. 하다를 사용하세요.in연산자(operator)를 선택합니다.

"theFu" in window; // true
"theFoo" in window; // false

알고 undefined 이렇게 해서 typeof되는 것이 됩니다.

if (typeof myVar !== 'undefined')

★★★와의 직접 undefinedundefined덮어쓸 수 있습니다.

window.undefined = "foo";
"foo" == undefined // true

@와 같이, 5th 및 @CMS Cript 5th Ed.에서되었습니다.undefined고장입입니니다

if (window.myVar)이러한 거짓 값도 포함되기 때문에 그다지 견고하지 않습니다.

거짓의0""NaN무효정의되어 있지 않다

케이스인 감사합니다.if (myVariable)두 가지 경우에 오류를 발생시킬 수도 있습니다.되지 않은입니다.ReferenceError

// abc was never declared.
if (abc) {
    // ReferenceError: abc is not defined
} 

다른 하나는 변수가 정의되었지만 호출 시 오류를 발생시키는 getter 함수가 있는 경우입니다.예를들면,

// or it's a property that can throw an error
Object.defineProperty(window, "myVariable", { 
    get: function() { throw new Error("W00t?"); }, 
    set: undefined 
});
if (myVariable) {
    // Error: W00t?
}

저는 개인적으로

myVar === undefined

" ": ": ": ":":=== is is is에 == 그 리리 and and andmyVar이미 선언되어 있습니다(정의되어 있지 않습니다).


에 안 들어.typeof myVar === "undefined"긴 감기와 불필요한 작업이라고 생각합니다.(더 적은 코드로 같은 작업을 할 수 있습니다.)

어떤 사람들은 이 글을 읽을 때 "잠깐만요"라고 소리치며 쓰러질 것이다.★★★★★★★★★★★★★★★★★★!undefined정의"!!!!!!"

멋지다, 나도 알아한편, Javascript의 대부분의 변수는 재정의할 수 있습니다.재정의할 수 있는 임베디드 식별자를 사용하지 마십시오.

이 규칙을 따른다면 다행이다. 너는 위선자가 아니다.

JS에서 많은 실제 작업을 수행하기 위해서는 개발자가 재정의 가능한 식별자에 의존해야 합니다.는 사람들이 것을.setTimeout 수 있기

window.setTimeout = function () {
    alert("Got you now!");
};

"할 수 는 " raw로, raw로, raw로, raw로, raw로, raw로, raw로, raw로, raw로, raw로, raw로, raw로, raw로, raw로, 로, raw=== undefined가짜야

)undefined왜 검증되지 않은 라이브러리 코드를 코드 베이스에 맹목적으로 통합합니까?을 참조해 주십시오.)


, 를, 를, 예, 예, also, also, also, also처럼typeofaccess, 이 되지 않은 변수, 즉 "Detect(검출 수법은 "Detect"할 수 있습니다.

if (window.someVar === undefined) {
    doSomething();
}

하지만 이 두 기술 모두 추상화에서 새어 나옵니다.나는 당신이 이것을 사용하지 말 것을 권한다.

if (typeof myVar !== "undefined") {
    doSomething();
}

고려사항:

var iAmUndefined;

하려면 , 「알 수 없다」에 경우가 .in(O_o)

if ("myVar" in window) {
    doSomething();
}

하지만 기다려!있어! 어!! 체인 매직 시제품이 만들어지면 어떻게 될까요?도 마찬가지입니다.in동안, 99%의 시간 동안, 99%의 시간 동안, 이 .)=== undefinedtypeof을 사용하다만약 당신이 정말로 관심이 있다면, 당신은 이 주제에 대해 스스로 읽을 수 있습니다.)

2020년 갱신

typeof체크,그 체크(체크),undefinedECMAScript 5입니다.하나는 ', 하다, 하다, 하다'를 사용할 수 .typeof선언되지 않은 변수의 유형을 확인하는 것은 항상 틈새였습니다.따라서 대부분의 경우 직접 비교를 사용하는 것이 좋습니다.

myVariable === undefined

2010년 원본 답변

「」를 사용합니다.typeof제 취향입니다.은 변수가때 동작합니다.는 변수가 선언되지 않은 경우와는 합니다.것은,, 른른른른른른 릅릅릅릅릅릅== ★★★★★★★★★★★★★★★★★」===을 사용합니다.if ( . )undefined는, 「」와 달리, 「」는 다릅니다.null또한 ECMAScript 3 환경에서도 재정의되어 비교에 신뢰성이 낮아질 수 있습니다.다만, 현재는 거의 모든 공통 환경이 ECMAScript 5 이상에 준거하고 있습니다).

if (typeof someUndeclaredVariable == "undefined") {
    // Works
}

if (someUndeclaredVariable === undefined) { 
    // Throws an error
}

하시면 됩니다.typeof 이렇게요.

if (typeof something != "undefined") {
    // ...
}

업데이트 2018-07-25

이 게시물이 처음 만들어진 지 거의 5년이 지났고 자바스크립트는 큰 발전을 이루었습니다.처음 투고에서 테스트를 반복하면서 다음 테스트 방법 간에 일관된 차이를 발견하지 못했습니다.

  • abc === undefined
  • abc === void 0
  • typeof abc == 'undefined'
  • typeof abc === 'undefined'

Chrome의 최적화를 막기 위해 테스트를 수정해도 차이는 미미했습니다. 지금 하는 것은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.abc === undefined명확성을 위해.

★★★★★★★★★★★★★★의 관련 내용chrome://version:

  • Google Chrome: 67.0.3396.99(오피셜 빌드)(64비트)(코호트: 안정적)
  • 리비전: a337fbf3c2ab8ebc6bc6b0bfdce73e2e2252b-refs/branch-heads/3396@{#790}
  • OS: Windows
  • JavaScript: V8 6.7.288.46
  • 사용자 에이전트: Mozilla/5.0(Windows NT 10.0, Win64, x64) Apple WebKit/537.36(KHTML, Gecko 등) Chrome/67.0.3396.99 Safari/537.36

원본 2013-11-01년 이후

크롬에서는 크롬보다 더.typeof 예:

if (abc === void 0) {
    // Undefined
}

그 차이는 무시해도 될 정도였다.이 , 이, 이, 이, 이, 이, 이, what, what, what, what, what, what, what, what, what, what, what, what, what, what, what, what, what, what, what, what, what, what, void 0해 주세요.abc 그래도 선언해야 합니다.

다.typeof ★★★★★★★★★★★★★★★★★」void 보다 훨씬 빨랐다undefinedChrome 개발자 콘솔에서 다음과 같은 테스트 형식을 사용했습니다.

var abc;
start = +new Date();
for (var i = 0; i < 10000000; i++) {
    if (TEST) {
        void 1;
    }
}
end = +new Date();
end - start;

결과는 다음과 같습니다.

Test: | abc === undefined      abc === void 0      typeof abc == 'undefined'
------+---------------------------------------------------------------------
x10M  |     13678 ms               9854 ms                 9888 ms
  x1  |    1367.8 ns              985.4 ns                988.8 ns

첫 번째 행은 밀리초 단위이고 두 번째 행은 나노초 단위입니다.3.4나노초의 차이는 아무것도 아닙니다.그 이후의 시험에서도 시간은 꽤 일치했다.

정의되지 않은 경우 문자열이 정의되지 않았기 때문에 "정의되지 않음" 문자를 포함하는 문자열과 동일하지 않습니다.

변수의 유형을 확인할 수 있습니다.

if (typeof(something) != "undefined") ...

때로는 유형을 확인할 필요도 없습니다.변수 값이 설정되었을 때 false로 평가되지 않는 경우(예를 들어 변수가 함수인 경우) 변수를 평가할 수 있습니다.예:

if (something) {
  something(param);
}
if (typeof foo == 'undefined') {
 // Do something
};

한 비교 「 「 」 )에해 주세요.!==이 경우 )는 필요 없습니다.typeof는 항상 문자열을 반환합니다.

다양한 답변의 결과를 나타내는 몇 가지 시나리오: http://jsfiddle.net/drzaus/UVjM4/

(「」의 var★★★★★★에in테스트에서는 스코프 래퍼에 포함되어 있는 경우에 차이가 생깁니다.

참조용 코드:

(function(undefined) {
    var definedButNotInitialized;
    definedAndInitialized = 3;
    someObject = {
        firstProp: "1"
        , secondProp: false
        // , undefinedProp not defined
    }
    // var notDefined;

    var tests = [
        'definedButNotInitialized in window',
        'definedAndInitialized in window',
        'someObject.firstProp in window',
        'someObject.secondProp in window',
        'someObject.undefinedProp in window',
        'notDefined in window',

        '"definedButNotInitialized" in window',
        '"definedAndInitialized" in window',
        '"someObject.firstProp" in window',
        '"someObject.secondProp" in window',
        '"someObject.undefinedProp" in window',
        '"notDefined" in window',

        'typeof definedButNotInitialized == "undefined"',
        'typeof definedButNotInitialized === typeof undefined',
        'definedButNotInitialized === undefined',
        '! definedButNotInitialized',
        '!! definedButNotInitialized',

        'typeof definedAndInitialized == "undefined"',
        'typeof definedAndInitialized === typeof undefined',
        'definedAndInitialized === undefined',
        '! definedAndInitialized',
        '!! definedAndInitialized',

        'typeof someObject.firstProp == "undefined"',
        'typeof someObject.firstProp === typeof undefined',
        'someObject.firstProp === undefined',
        '! someObject.firstProp',
        '!! someObject.firstProp',

        'typeof someObject.secondProp == "undefined"',
        'typeof someObject.secondProp === typeof undefined',
        'someObject.secondProp === undefined',
        '! someObject.secondProp',
        '!! someObject.secondProp',

        'typeof someObject.undefinedProp == "undefined"',
        'typeof someObject.undefinedProp === typeof undefined',
        'someObject.undefinedProp === undefined',
        '! someObject.undefinedProp',
        '!! someObject.undefinedProp',

        'typeof notDefined == "undefined"',
        'typeof notDefined === typeof undefined',
        'notDefined === undefined',
        '! notDefined',
        '!! notDefined'
    ];

    var output = document.getElementById('results');
    var result = '';
    for(var t in tests) {
        if( !tests.hasOwnProperty(t) ) continue; // bleh

        try {
            result = eval(tests[t]);
        } catch(ex) {
            result = 'Exception--' + ex;
        }
        console.log(tests[t], result);
        output.innerHTML += "\n" + tests[t] + ": " + result;
    }
})();

결과:

definedButNotInitialized in window: true
definedAndInitialized in window: false
someObject.firstProp in window: false
someObject.secondProp in window: false
someObject.undefinedProp in window: true
notDefined in window: Exception--ReferenceError: notDefined is not defined
"definedButNotInitialized" in window: false
"definedAndInitialized" in window: true
"someObject.firstProp" in window: false
"someObject.secondProp" in window: false
"someObject.undefinedProp" in window: false
"notDefined" in window: false
typeof definedButNotInitialized == "undefined": true
typeof definedButNotInitialized === typeof undefined: true
definedButNotInitialized === undefined: true
! definedButNotInitialized: true
!! definedButNotInitialized: false
typeof definedAndInitialized == "undefined": false
typeof definedAndInitialized === typeof undefined: false
definedAndInitialized === undefined: false
! definedAndInitialized: false
!! definedAndInitialized: true
typeof someObject.firstProp == "undefined": false
typeof someObject.firstProp === typeof undefined: false
someObject.firstProp === undefined: false
! someObject.firstProp: false
!! someObject.firstProp: true
typeof someObject.secondProp == "undefined": false
typeof someObject.secondProp === typeof undefined: false
someObject.secondProp === undefined: false
! someObject.secondProp: true
!! someObject.secondProp: false
typeof someObject.undefinedProp == "undefined": true
typeof someObject.undefinedProp === typeof undefined: true
someObject.undefinedProp === undefined: true
! someObject.undefinedProp: true
!! someObject.undefinedProp: false
typeof notDefined == "undefined": true
typeof notDefined === typeof undefined: true
notDefined === undefined: Exception--ReferenceError: notDefined is not defined
! notDefined: Exception--ReferenceError: notDefined is not defined
!! notDefined: Exception--ReferenceError: notDefined is not defined

기사에서는 Underscore.js와 같은 프레임워크에서 다음 함수를 사용하는 것을 읽었습니다.

function isUndefined(obj){
    return obj === void 0;
}

개인적으로는 항상 다음을 사용합니다.

var x;
if( x === undefined) {
    //Do something here
}
else {
   //Do something else here
}

window.undefined 속성은 최신 브라우저(JavaScript 1.8.5 이후)에서 쓸 수 없습니다.Mozilla의 매뉴얼 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined,에서 볼 수 있는 내용은 다음과 같습니다.type of()를 사용하는 이유 중 하나는 변수가 정의되지 않은 경우 오류가 발생하지 않기 때문입니다.

저는 다음과 같은 방법을 사용하는 것을 선호합니다.

x === undefined 

왜냐하면 x가 아직 선언되지 않았다면 묵묵히 통과/불합격하는 것이 아니라 실패하여 내 면전에서 폭발하기 때문이다.x가 선언되지 않았음을 경고합니다.JavaScript에서 사용되는 모든 변수는 선언되어야 한다고 생각합니다.

가 있는 가장 할 수 있는 undefinedvoid 0.

은 새로운 및 되며, """와 수 ."""라고 합니다.window.undefined을 사용하다

if( myVar === void 0){
    //yup it's undefined
}

다른 답변은 전혀 도움이 되지 않았기 때문에 이렇게 하는 것이 좋습니다.Internet Explorer 8에서는 동작했습니다.

if (typeof variable_name.value === 'undefined') {
    // variable_name is undefined
}
// x has not been defined before
if (typeof x === 'undefined') { // Evaluates to true without errors.
   // These statements execute.
}

if (x === undefined) { // Throws a ReferenceError

}

@Thomas Eding의 대답과는 정반대입니다.

하는 것을 myVar 코드로,는 내로,, ......난난...를 얻을 수 .myVar is not defined.

예를 들어 보겠습니다.

변수 이름이 있는데, 어디선가 선언이 된 건지는 잘 모르겠어요.

그러면 @Anurag의 답변이 도움이 됩니다.

var myVariableToCheck = 'myVar';
if (window[myVariableToCheck] === undefined)
    console.log("Not declared or declared, but undefined.");

// Or you can check it directly 
if (window['myVar'] === undefined) 
    console.log("Not declared or declared, but undefined.");
    var x;
    if (x === undefined) {
        alert ("I am declared, but not defined.")
    };
    if (typeof y === "undefined") {
        alert ("I am not even declared.")
    };

    /* One more thing to understand: typeof ==='undefined' also checks 
       for if a variable is declared, but no value is assigned. In other 
       words, the variable is declared, but not defined. */

    // Will repeat above logic of x for typeof === 'undefined'
    if (x === undefined) {
        alert ("I am declared, but not defined.")
    };
    /* So typeof === 'undefined' works for both, but x === undefined 
       only works for a variable which is at least declared. */

    /* Say if I try using typeof === undefined (not in quotes) for 
       a variable which is not even declared, we will get run a 
       time error. */

    if (z === undefined) {
        alert ("I am neither declared nor defined.")
    };
    // I got this error for z ReferenceError: z is not defined 

함수 매개 변수로 사용하고 함수 실행 시 제외합니다. 이렇게 하면 "실제"가 정의되지 않습니다.함수 안에 코드를 넣어야 합니다.jQuery 소스를 읽다가 이걸 발견했어요.

undefined = 2;

(function (undefined) {
   console.log(undefined); // prints out undefined
   // and for comparison:
   if (undeclaredvar === undefined) console.log("it works!")
})()

그냥 쓰셔도 되고요.typeof★★★★, 제는, 때문에, 이 를 절약할 수 입니다.그러나 내 코드는 보통 포함 함수 안에 있기 때문에 이 방법을 사용하면 여기저기서 몇 바이트를 절약할 수 있을 것입니다.

언급URL : https://stackoverflow.com/questions/3390396/how-can-i-check-for-undefined-in-javascript

반응형