JavaScript에서 변수가 정의되지 않았는지 테스트하는 가장 적절한 방법은 무엇입니까?
몇 가지 가능한 방법을 보았습니다.
if (window.myVariable)
또는
if (typeof(myVariable) != "undefined")
또는
if (myVariable) // This throws an error if undefined. Should this be in Try/Catch?
질문자 :Christopher Jon Mankowski
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
연산자를 사용하십시오.
"theFu" in window; // true "theFoo" in window; // false
변수가 선언되지 않았는지 또는 값이 undefined
인지 알고 싶다면 문자열 반환이 보장되는 typeof
연산자를 사용하세요.
if (typeof myVar !== 'undefined')
에 대한 직접 비교 undefined
같은 골칫거리입니다 undefined
덮어 쓸 수 있습니다.
window.undefined = "foo"; "foo" == undefined // true
@CMS가 지적했듯이 이것은 ECMAScript 5th ed.에서 패치되었으며 undefined
는 쓸 수 없습니다.
if (window.myVar)
도 이러한 거짓 값을 포함하므로 그다지 강력하지 않습니다.
거짓 0 "" 난 없는 찾으시는 주소가 없습니다
if (myVariable)
도 두 가지 경우에 오류를 던질 수 있음을 지적해 주신 @CMS에게 감사드립니다. 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
경고: ===
==
위에 사용되며 myVar
는 이전에 선언되었습니다 (정의 되지 않음).
typeof myVar === "undefined"
마음에 들지 않습니다. 나는 그것이 길고 불필요하다고 생각합니다. (더 적은 코드로 동일한 작업을 수행할 수 있습니다.)
이제 어떤 사람들은 이것을 읽을 때 고통스러워하며 소리를 지르게 undefined
는 재정의될 수 있습니다!"
멋있는. 나는이 사실을 알고. 그런 다음 다시 Javascript의 대부분의 변수를 재정의할 수 있습니다. 재정의할 수 있는 내장 식별자를 사용해서는 안 됩니까?
이 규칙을 따르면 당신에게 유익합니다. 당신은 위선자가 아닙니다.
문제는 JS에서 많은 실제 작업을 수행하기 위해 개발자는 재정의 가능한 식별자에 의존해야 한다는 것입니다. setTimeout
사용하지 말아야 한다고 말하는 것을 듣지 못했습니다. 왜냐하면 누군가는
window.setTimeout = function () { alert("Got you now!"); };
=== undefined
사용하지 않는다는 "재정의 가능" 인수는 가짜입니다.
undefined
재정의되는 것이 여전히 두렵다면 테스트되지 않은 라이브러리 코드를 코드 베이스에 맹목적으로 통합하는 이유는 무엇입니까? 또는 더 간단하게는 린팅 도구입니다.)
typeof
접근 방식과 마찬가지로 이 기술은 선언되지 않은 변수를 "탐지"할 수 있습니다.
if (window.someVar === undefined) { doSomething(); }
그러나 이 두 기술 모두 추상화에서 누출됩니다. 나는 당신이 이것을 사용하지 않거나 심지어
if (typeof myVar !== "undefined") { doSomething(); }
고려하다:
var iAmUndefined;
해당 변수가 선언되었는지 여부를 파악하려면 in
연산자를 사용해야 할 수도 있습니다. (대부분의 경우 단순히 코드 O_o를 읽을 수 있습니다.)
if ("myVar" in window) { doSomething(); }
하지만 기다려! 더있다! 프로토타입 체인 마법이 일어난다면...? 지금도 우수한 in
운영자는 충분하지 않습니다. === undefined
(그리고 ****cough**** typeof
)가 잘 작동한다는 것을 제외하고 이 부분에 대해 여기에서 끝났습니다. 당신이 정말로 신경을 쓴다면, 당신은 할 수 있습니다 이 주제에 대해 독자적으로 읽으십시오.)
2020년 업데이트
typeof
검사를 선호하는 이유 중 하나(즉, undefined
를 재정의할 수 있음)는 ECMAScript 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") { // ... }
이 게시물이 처음 작성된 지 거의 5년이 지났고 JavaScript는 먼 길을 왔습니다. 원래 게시물에서 테스트를 반복하면서 다음 테스트 방법 간에 일관된 차이점을 찾지 못했습니다.
abc === undefined
abc === void 0
typeof abc == 'undefined'
typeof abc === 'undefined'
Chrome이 테스트를 최적화하지 못하도록 테스트를 수정한 경우에도 그 차이는 미미했습니다. 따라서 이제 명확성을 위해 abc === undefined
chrome://version
관련 콘텐츠:
구글 크롬에서, 다음이 약간 빨리 어느 때보했다 typeof
시험 :
if (abc === void 0) { // Undefined }
그 차이는 미미했습니다. void 0
이 무엇을 의미하는지 아는 사람에게 더 간결하고 한 눈에 더 명확합니다. 그러나 abc
는 여전히 선언되어야 합니다 .
typeof
와 void
모두 undefined
와 직접 비교하는 것보다 훨씬 빠릅니다. Chrome 개발자 콘솔에서 다음 테스트 형식을 사용했습니다.
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나노초의 차이는 아무것도 아닙니다. 시간은 후속 테스트에서 꽤 일관되었습니다.
정의되지 않은 경우 문자열이 정의되지 않았으므로 "undefined" 문자가 포함된 문자열과 같지 않습니다.
변수 유형을 확인할 수 있습니다.
if (typeof(something) != "undefined") ...
때로는 유형을 확인할 필요조차 없습니다. 변수 값이 설정되었을 때 false로 평가할 수 없는 경우(예: 함수인 경우) 변수를 평가할 수 있습니다. 예시:
if (something) { something(param); }
if (typeof foo == 'undefined') { // Do something };
typeof
는 항상 문자열을 반환하므로 엄격한 비교( !==
)는 이 경우 필요하지 않습니다.
다양한 답변의 결과를 보여주는 몇 가지 시나리오: http://jsfiddle.net/drzaus/UVjM4/
( in
var
를 사용하면 범위가 지정된 래퍼에서 차이가 발생합니다.)
참고용 코드:
(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 , 나는 이것을 봅니다: typeof()를 사용하는 한 가지 이유는 다음과 같은 경우 오류가 발생하지 않는다는 것입니다. 변수가 정의되지 않았습니다.
사용하는 방식을 선호합니다.
x === undefined
x가 이전에 선언되지 않은 경우 자동으로 통과/실패하는 대신 실패하고 내 얼굴에 폭발하기 때문입니다. 이것은 x가 선언되지 않았음을 경고합니다. JavaScript에서 사용되는 모든 변수는 선언되어야 한다고 생각합니다.
undefined
를 확인하는 가장 안정적인 방법 void 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 }
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
@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.");
나는 그것을 함수 매개 변수로 사용하고 "실제"가 정의되지 않은 방식으로 함수 실행에서 제외합니다. 코드를 함수 안에 넣어야 하지만. jQuery 소스를 읽는 동안 이것을 발견했습니다.
undefined = 2; (function (undefined) { console.log(undefined); // prints out undefined // and for comparison: if (undeclaredvar === undefined) console.log("it works!") })()
typeof
사용할 수도 있습니다. 그러나 내 모든 코드는 일반적으로 어쨌든 포함하는 함수 안에 있으므로 이 방법을 사용하면 여기저기서 몇 바이트를 절약할 수 있습니다.
출처 : http:www.stackoverflow.com/questions/3390396/how-can-i-check-for-undefined-in-javascript
쉘에서 " 2>&1 "은 무엇을 의미합니까? (0) | 2021.11.09 |
---|---|
Python에서 파일 또는 폴더를 삭제하는 방법은 무엇입니까? (0) | 2021.11.09 |
열 값을 기반으로 DataFrame에서 행을 어떻게 선택합니까? (0) | 2021.11.09 |
병합 충돌이 발생했습니다. 병합을 어떻게 중단할 수 있습니까? (0) | 2021.11.09 |
__init__.py는 무엇을 위한 것입니까? (0) | 2021.11.09 |