JavaScript의 객체 속성이 정의되지 않았는지 확인하는 가장 좋은 방법은 무엇입니까?
질문자 :Matt Sheppard
undefined
특수 값인지 확인하는 일반적인 방법은 다음과 같습니다.
if(o.myProperty === undefined) { alert("myProperty value is the special value `undefined`"); }
객체에 실제로 그러한 속성이 없는지 확인하고 액세스하려고 할 때 기본적으로 undefined
if(!o.hasOwnProperty('myProperty')) { alert("myProperty does not exist"); }
식별자와 연결된 값이 undefined
특수 값인지 또는 해당 식별자가 선언되지 않았는지 확인합니다. 참고: 이 방법은 초기 오류 없이 선언되지 않은 undefined
값을 갖는 것과 다름) 식별자를 참조하는 유일한 방법입니다.
if(typeof myVariable === 'undefined') { alert('myVariable is either the special value `undefined`, or it has not been declared'); }
ECMAScript 5 이전의 JavaScript 버전에서는 전역 객체의 "undefined" 속성이 쓰기 가능하므로 간단한 검사 foo === undefined
가 실수로 재정의된 경우 예기치 않게 작동할 수 있습니다. 최신 JavaScript에서 속성은 읽기 전용입니다.
그러나 현대 JavaScript에서 "undefined"는 키워드가 아니므로 함수 내부의 변수는 "undefined"로 이름을 지정하고 전역 속성을 숨길 수 있습니다.
이 (가능성이 없는) 극단적인 경우가 걱정된다면 void 연산자 undefined
특별한 값 자체를 얻을 수 있습니다.
if(myVariable === void 0) { alert("myVariable is the special value `undefined`"); }
Erwin
나는 이 주제에 대해 많은 오답이 있다고 생각합니다. 일반적인 믿음과 달리 "undefined"는 JavaScript에서 키워드가 아니며 실제로 할당된 값을 가질 수 있습니다.
올바른 코드
이 테스트를 수행하는 가장 강력한 방법은 다음과 같습니다.
if (typeof myVar === "undefined")
이것은 항상 올바른 결과를 반환하고 myVar
가 선언되지 않은 상황도 처리합니다.
코드를 퇴화합니다. 사용하지 마세요.
var undefined = false; // Shockingly, this is completely legal! if (myVar === undefined) { alert("You have been misled. Run away!"); }
또한 myVar === undefined
는 myVar가 선언되지 않은 상황에서 오류를 발생시킵니다.
MarkPflug
다른 많은 답변에서 격렬하게 권장되었지만 typeof
는 나쁜 선택 입니다. 이는 변수 값이 있는지 여부를 확인하기 위해 사용되지 않아야 undefined
이 값에 대한 결합 된 검사의 역할을하기 때문에, undefined
및 변수가 존재하는지 여부에 대한. 대부분의 경우 변수가 존재하는 시점을 알고 'undefined'
typeof
가 자동 실패 가능성을 소개합니다.
var snapshot = …; if (typeof snaposhot === 'undefined') { // ^ // misspelled¹ – this will never run, but it won't throw an error! }
var foo = …; if (typeof foo === 'undefned') { // ^ // misspelled – this will never run, but it won't throw an error! }
따라서 지정된 이름이 범위 내에 있는지 여부가 불확실한 기능 감지²를 수행하지 않는 한(예: CommonJS 환경에 대한 코드의 한 단계로 typeof module !== 'undefined'
typeof
는 사용 시 해로운 선택입니다. 변수에 대한 올바른 옵션은 값을 직접 비교하는 것입니다.
var foo = …; if (foo === undefined) { ⋮ }
이에 대한 몇 가지 일반적인 오해는 다음과 같습니다.
"초기화되지 않은" 변수(
var foo
) 또는 매개변수(function bar(foo) { … }
bar()
라고 함)를 읽는 것은 실패합니다. 이것은 단순히 사실이 아닙니다. 명시적 초기화가 없는 변수와 값이 제공undefined
매개변수는 항상 정의되지 않고 항상 범위 내에 있습니다.undefined
를 덮어쓸 수 있습니다. 그것은 사실입니다undefined
키워드 아니지만, 읽기 전용 및 비 구성.Object
,Math
,NaN
...)에도 불구하고 피하지 않는 다른 내장 기능이 있으며 실제 코드는 일반적으로 적극적으로 악의적인 환경에서 작성되지 않으므로 이것이 좋은 이유가 아닙니다.undefined
걱정됩니다. (그러나 코드 생성기를 작성하는 경우void 0
자유롭게 사용하십시오.)
변수가 작동하는 방식과 함께 실제 질문인 객체 속성을 해결할 때입니다. 객체 속성에 typeof
를 사용할 이유가 없습니다. 기능 감지에 관한 이전 예외는 여기에 적용되지 않습니다. typeof
는 변수에 대한 특별한 동작만 있고 객체 속성을 참조하는 표현식은 변수가 아닙니다.
이것:
if (typeof foo.bar === 'undefined') { ⋮ }
항상 정확히 다음과 같습니다 ³:
if (foo.bar === undefined) { ⋮ }
위의 조언을 고려하여 독자들이 typeof
===
를 사용하여 동등성을 확인하는 것이 가장 합리적입니다. 나중에 변수 값을 확인하도록 리팩토링할 수 있기 때문입니다. 그냥 평범한 것이 더 보기 좋기 때문에 여기에서도 항상 === undefined
³ 를 사용해야 합니다.
개체 속성과 관련하여 고려해야 할 또 다른 사항은 undefined
을 정말로 확인하고 싶은지 여부입니다. 소정의 속성 이름 (값은 제조 대상에 존재하지 않을 수 undefined
값을 가진 개체 자체에 존재하는 경우에 판독) undefined
값을 가진 개체의 프로토 타입에 존재하는 undefined
비와 그 중 하나에, 또는 본 undefined
값. 'key' in obj
는 키가 객체의 프로토타입 체인에 있는지 여부를 알려주고 Object.prototype.hasOwnProperty.call(obj, 'key')
는 객체에 직접 있는지 여부를 알려줍니다. 프로토타입과 객체를 문자열 키 맵으로 사용하는 것에 대한 이 답변에서 자세히 설명하지 않겠습니다. 왜냐하면 원래 질문에 대한 가능한 해석에 관계없이 다른 답변의 모든 나쁜 조언에 대응하기 위한 것이기 때문입니다. 자세한 내용 은 MDN의 개체 프로토타입을 읽어보세요!
¹ 예시 변수 이름의 비정상적인 선택? 이것은 Firefox용 NoScript 확장의 실제 데드 코드입니다.
² 그러나 범위에 있는 것을 모르는 것이 일반적으로 괜찮다고 가정하지 마십시오. 동적 범위 남용으로 인한 보너스 취약점: Project Zero 1225
³ 다시 한 번 ES5+ 환경을 가정하고 undefined
는 undefined
속성을 나타냅니다.
Ry-
JavaScript에는 null이 있고 undefined가 있습니다. 그들은 다른 의미를 가지고 있습니다.
- undefined는 변수 값이 정의되지 않았음을 의미합니다. 값이 무엇인지 알 수 없습니다.
- null 은 변수 값이 정의되어 null(값 없음)로 설정되었음을 의미합니다.
Marijn Haverbeke는 무료 온라인 책 " Eloquent JavaScript "에서 다음과 같이 말합니다.
'이 값은 정의되었지만 값이 없습니다'라는 의미의 유사한 값인 null도 있습니다. undefined와 null의 의미 차이는 대부분 학문적이며 일반적으로 그다지 흥미롭지 않습니다. 실제 프로그램에서는 어떤 것이 '가치가 있는지'를 확인해야 하는 경우가 많습니다. 이러한 경우에 something == undefined라는 표현식을 사용할 수 있습니다. 정확히 같은 값은 아니지만 null == undefined는 true를 생성하기 때문입니다.
따라서 정의되지 않은 것이 있는지 확인하는 가장 좋은 방법은 다음과 같습니다.
if (something == undefined)
개체 속성은 동일한 방식으로 작동해야 합니다.
var person = { name: "John", age: 28, sex: "male" }; alert(person.name); // "John" alert(person.fakeVariable); // undefined
Pandincus
이것은 "정의되지 않은 개체 속성"을 의미 합니까?
실제로 그것은 두 가지 완전히 다른 것을 의미할 수 있습니다! 첫째, 객체에 정의된 적이 없는 속성을 의미할 수 있고, 둘째, 값이 정의되지 않은 속성을 의미할 수 있습니다. 이 코드를 살펴보겠습니다.
var o = { a: undefined }
oa
정의되지 않았습니까? 예! 그 값은 정의되지 않습니다. ob
정의되지 않았습니까? 확신하는! 속성 'b'가 전혀 없습니다! 자, 이제 두 상황에서 서로 다른 접근 방식이 어떻게 작동하는지 확인하세요.
typeof oa == 'undefined' // true typeof ob == 'undefined' // true oa === undefined // true ob === undefined // true 'a' in o // true 'b' in o // false
typeof obj.prop == 'undefined'
와 obj.prop === undefined
는 동등하며 서로 다른 상황을 구분하지 않는다는 것을 분명히 알 수 있습니다. 그리고 'prop' in obj
는 속성이 전혀 정의되지 않은 상황을 감지할 수 있고 정의되지 않은 속성 값에 주의를 기울이지 않습니다.
그래서 뭘 할건데?
1) 속성이 첫 번째 또는 두 번째 의미(가장 일반적인 상황)에 의해 정의되지 않았는지 알고 싶습니다.
obj.prop === undefined // IMHO, see "final fight" below
2) 객체에 속성이 있고 그 값은 신경 쓰지 않는지 알고 싶습니다.
'prop' in obj
노트:
- 개체와 속성을 동시에 확인할 수 없습니다. 예를 들어, 이
xa === undefined
또는 이typeof xa == 'undefined'
ReferenceError: x is not defined
시킵니다. x가 정의되지 않은 경우 x는 정의되지 않습니다. -
undefined
변수는 전역 변수입니다(실제로window.undefined
입니다). ECMAScript 1st Edition부터 지원되고 ECMAScript 5부터 읽기 전용 입니다. 따라서 최신 브라우저에서는 많은 작성자가 우리를 두렵게 하기를 좋아하기 때문에 true로 재정의할 수 없지만 이는 구형 브라우저에서 여전히 사실입니다.
최종 싸움: obj.prop === undefined
대 typeof obj.prop == 'undefined'
obj.prop의 obj.prop === undefined
:
- 좀 더 짧고 더 이뻐보이네요
-
undefined
철자를 잘못 입력하면 JavaScript 엔진에서 오류가 발생합니다.
obj.prop obj.prop === undefined
의 빼기:
-
undefined
는 이전 브라우저에서 재정의할 수 있습니다.
typeof obj.prop == 'undefined'
:
- 정말 보편적입니다! 신규 및 기존 브라우저에서 작동합니다.
typeof obj.prop == 'undefined'
:
-
'undefned'
( 철자 오류 )는 문자열 상수일 뿐이므로 제가 방금 한 것처럼 철자가 틀리면 JavaScript 엔진이 도움이 되지 않습니다.
업데이트(서버 측 JavaScript용):
Node.js는 undefined
전역 변수를 global.undefined
로 지원합니다('global' 접두사 없이도 사용할 수 있음). 서버 측 JavaScript의 다른 구현에 대해서는 모릅니다.
Konstantin Smolyanin
문제는 세 가지 경우로 요약됩니다.
- 개체에 속성이 있고 해당 값이
undefined
가 아닙니다. - 개체에 속성이 있고 해당 값이
undefined
입니다. - 개체에 속성이 없습니다.
이것은 내가 중요하다고 생각하는 것을 알려줍니다.
정의되지 않은 멤버와 정의되지 않은 값이 있는 정의된 멤버 사이에는 차이가 있습니다.
그러나 불행하게도 typeof obj.foo
은 세 가지 경우 중 어떤 경우인지 알려주지 않습니다. 그러나 우리는 이것을 "foo" in obj
와 결합하여 케이스를 구별할 수 있습니다.
| typeof obj.x === 'undefined' | !("x" in obj) 1. { x:1 } | false | false 2. { x : (function(){})() } | true | false 3. {} | true | true
null
항목에 대해서도 동일하다는 점은 주목할 가치가 있습니다.
| typeof obj.x === 'undefined' | !("x" in obj) { x:null } | false | false
어떤 경우에는 속성이 정의되지 않았는지 확인하는 것보다 속성이 있는지 확인하는 것이 더 합리적이고 더 명확하다고 주장합니다. 이 확인이 다른 유일한 경우는 드문 경우인 경우 2입니다. 정의되지 않은 값이 있는 개체의 실제 항목입니다.
예를 들어: 저는 객체에 주어진 속성이 있는지 여부를 확인하는 많은 코드를 리팩토링했습니다.
if( typeof blob.x != 'undefined' ) { fn(blob.x); }
undefined에 대한 검사 없이 작성했을 때 더 명확했습니다.
if( "x" in blob ) { fn(blob.x); }
그러나 언급한 바와 같이 이것들은 정확히 같지는 않습니다(그러나 제 요구에 충분합니다).
Michael Anderson
if ( typeof( something ) == "undefined")
이것은 다른 사람들이하지 않는 동안 나를 위해 일했습니다.
Kevin
typeof
와 함께 ===
를 사용하는 기원이 어디에서 왔는지 잘 모르겠고 관례에 따라 많은 라이브러리에서 사용되는 것을 보았지만 typeof 연산자는 문자열 리터럴을 반환하고 우리는 그것을 미리 알고 있습니다. 그래서 왜 당신은 또한 확인을 입력하시겠습니까?
typeof x; // some string literal "string", "object", "undefined" if (typeof x === "string") { // === is redundant because we already know typeof returns a string literal if (typeof x == "string") { // sufficient
Eric
나는 재산 전에 물건을 확인하는 사람을 보지 못했습니다. 따라서 이것은 가장 짧고 가장 효과적입니다(꼭 가장 명확하지는 않지만).
if (obj && obj.prop) { // Do something; }
obj 또는 obj.prop이 정의되지 않았거나 null 또는 "falsy"인 경우 if 문은 코드 블록을 실행하지 않습니다. 이것은 일반적으로 대부분의 코드 블록 문(JavaScript에서)에서 원하는 동작입니다.
업데이트: (2021년 7월 2일)
최신 버전의 JavaScript에는 선택적 연결을 위한 새로운 연산자인 ?.
이것은 아마도 객체 속성의 존재를 확인하는 가장 명확하고 효율적인 방법이 될 것입니다.
참조: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
Joe Johnson
관련 질문에서 내 답변 을 교차 게시 JavaScript에서 "정의되지 않음"을 어떻게 확인할 수 있습니까? .
이 질문과 관련하여 someObject.<whatever>
테스트 사례를 참조하십시오.
다양한 답변의 결과를 보여주는 몇 가지 시나리오: 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
drzaus
하면
if (myvar == undefined ) { alert('var does not exists or is not initialized'); }
myvar
변수가 존재하지 않으면 실패할 것입니다. myvar가 정의되어 있지 않기 때문에 스크립트가 손상되고 테스트가 효과가 없기 때문입니다.
창 개체는 함수 외부에 전역 범위(기본 개체)를 가지므로 선언은 창 개체에 '첨부'됩니다.
예를 들어:
var myvar = 'test';
전역 변수 myvar 는 window.myvar 또는 window['myvar'] 와 동일합니다.
전역 변수가 존재할 때 테스트할 오류를 피하려면 다음을 사용하는 것이 좋습니다.
if(window.myvar == undefined ) { alert('var does not exists or is not initialized'); }
변수가 실제로 존재하는지 여부는 중요하지 않으며 값이 올바르지 않습니다. 그렇지 않으면 undefined로 변수를 초기화하는 것은 어리석은 일이며 false 값을 사용하여 초기화하는 것이 좋습니다. 선언한 모든 변수가 false로 초기화된다는 것을 알고 있으면 해당 유형을 확인하거나 !window.myvar
에 의존하여 적절한/유효한 값이 있는지 확인할 수 있습니다. 따라서 변수가 정의되지 않은 경우에도 !window.myvar
는 myvar = undefined
또는 myvar = false
또는 myvar = 0
합니다.
특정 유형이 예상되면 변수의 유형을 테스트하십시오. 조건 테스트 속도를 높이려면 다음을 수행하는 것이 좋습니다.
if( !window.myvar || typeof window.myvar != 'string' ) { alert('var does not exists or is not type of string'); }
첫 번째 간단한 조건이 참이면 인터프리터는 다음 테스트를 건너뜁니다.
변수의 인스턴스/객체를 사용하여 유효한 값을 얻었는지 확인하는 것이 항상 더 좋습니다. 더 안정적이고 더 나은 프로그래밍 방법입니다.
(와이)
Codebeat
Exploring the Abyss of Null and Undefined in JavaScript 기사 에서 Underscore.js 와 같은 프레임워크가 이 함수를 사용한다는 것을 읽었습니다.
function isUndefined(obj){ return obj === void 0; }
Marthijn
JavaScript에서 정의되지 않은 것은 무엇이든 정의 되지 않고 객체/배열 내부의 속성인지 아니면 단순한 변수인지는 중요하지 않습니다...
JavaScript에는 정의되지 않은 변수를 매우 쉽게 감지할 수 있는 typeof
typeof whatever === 'undefined'
인지 확인하기만 하면 부울 값이 반환됩니다.
이것이 AngularJs v.1x의 유명한 함수 isUndefined()
가 작성되는 방식입니다.
function isUndefined(value) {return typeof value === 'undefined';}
따라서 함수가 값을 받는 것을 볼 수 있듯이 해당 값이 정의된 경우 false
를 반환하고, 정의되지 않은 값의 경우 true
반환합니다.
따라서 아래와 같은 객체 속성을 포함하여 값을 전달할 때 결과가 어떻게 되는지 살펴보겠습니다. 다음은 우리가 가지고 있는 변수 목록입니다.
var stackoverflow = {}; stackoverflow.javascipt = 'javascript'; var today; var self = this; var num = 8; var list = [1, 2, 3, 4, 5]; var y = null;
그리고 아래와 같이 확인하면 그 앞에 댓글로 결과를 볼 수 있습니다.
isUndefined(stackoverflow); //false isUndefined(stackoverflow.javascipt); //false isUndefined(today); //true isUndefined(self); //false isUndefined(num); //false isUndefined(list); //false isUndefined(y); //false isUndefined(stackoverflow.java); //true isUndefined(stackoverflow.php); //true isUndefined(stackoverflow && stackoverflow.css); //true
보시다시피 코드에서 이와 같은 것을 사용하여 모든 것을 확인할 수 있습니다. 언급한 typeof
를 사용하기만 하면 됩니다. 하지만 반복해서 사용하는 경우 공유하고 계속 재사용하는 각도 샘플과 같은 함수를 만드십시오. 다음 DRY 코드 패턴으로.
또한 한 가지 더, 객체가 있는지 없는지조차 확신할 수 없는 실제 응용 프로그램에서 객체의 속성을 확인하려면 먼저 객체가 있는지 확인하십시오.
개체의 속성을 확인했는데 개체가 존재하지 않으면 오류가 발생하고 전체 응용 프로그램 실행이 중지됩니다.
isUndefined(x.css); VM808:2 Uncaught ReferenceError: x is not defined(…)
매우 간단하여 아래와 같이 if 문 안에 래핑할 수 있습니다.
if(typeof x !== 'undefined') { //do something }
Angular 1.x의 isDefined와도 같습니다...
function isDefined(value) {return typeof value !== 'undefined';}
밑줄과 같은 다른 자바스크립트 프레임워크에도 비슷한 정의 검사가 있지만 이미 프레임워크를 사용하지 않는 경우 typeof
또한 typeof, undefined 및 void(0)에 대한 유용한 정보가 있는 MDN에서 이 섹션을 추가합니다.
엄격한 평등 및 정의되지 않음
정의되지 않은 것과 완전 항등 및 부등식 연산자를 사용하여 변수에 값이 있는지 여부를 확인할 수 있습니다. 다음 코드에서 변수 x는 정의되지 않고 if 문은 true로 평가됩니다.
var x; if (x === undefined) { // these statements execute } else { // these statements do not execute }
참고: 여기에서는 표준 항등 연산자가 아닌 완전 항등 연산자를 사용해야 합니다. x == undefined는 x가 null인지 여부도 확인하지만 완전 항등은 그렇지 않기 때문입니다. null은 undefined와 동일하지 않습니다. 자세한 내용은 비교 연산자를 참조하십시오.
Typeof 연산자 및 정의되지 않음
또는 typeof를 사용할 수 있습니다.
var x; if (typeof x === 'undefined') { // these statements execute }
typeof를 사용하는 한 가지 이유는 변수가 선언되지 않은 경우 오류가 발생하지 않기 때문입니다.
// x has not been declared before if (typeof x === 'undefined') { // evaluates to true without errors // these statements execute } if (x === undefined) { // throws a ReferenceError }
그러나 이런 종류의 기술은 피해야 합니다. JavaScript는 정적으로 범위가 지정된 언어이므로 변수가 선언되었는지 여부는 해당 변수가 둘러싸는 컨텍스트에서 선언되었는지 여부를 확인하여 읽을 수 있습니다. 유일한 예외는 전역 범위이지만 전역 범위는 전역 개체에 바인딩되므로 전역 컨텍스트에서 변수의 존재 여부를 확인하는 것은 전역 개체에 대한 속성의 존재를 확인하여 수행할 수 있습니다(in 연산자, 예를 들어).
무효 연산자 및 정의되지 않음
void 연산자는 세 번째 대안입니다.
var x; if (x === void 0) { // these statements execute } // y has not been declared before if (y === void 0) { // throws a ReferenceError (in contrast to `typeof`) }
더 > 여기
Alireza
' if (window.x) { } '는 오류에 안전합니다.
if (window.x)
를 원할 가능성이 큽니다. 이 검사는 x가 선언되지 않은 경우에도 안전합니다( var x;
) - 브라우저에서 오류가 발생하지 않습니다.
예: 내 브라우저가 History API를 지원하는지 알고 싶습니다.
if (window.history) { history.call_some_function(); }
작동 방식:
window 는 모든 전역 변수를 멤버로 보유하는 객체이며 존재하지 않는 멤버에 액세스를 시도하는 것은 합법적입니다. x 가 선언되지 않았거나 설정 되지 않은 window.x
는 undefined를 반환합니다. undefined 는 if()가 평가할 때 false로 이어집니다.
DenisS
쭉 읽어보니 이걸 못본게 신기하네요. 이를 위해 작동하는 여러 알고리즘을 찾았습니다.
정의되지 않음
객체의 값이 정의된 적이 없는 null
또는 undefined
로 정의된 경우 true
를 반환하지 않습니다. undefined
값으로 설정된 값에 대해 true를 반환하려는 경우에 유용합니다.
if(obj.prop === void 0) console.log("The value has never been defined");
정의되지 않음 또는 정의되지 않음으로 정의됨
undefined
값에 대해 결과가 true
=== undefined
를 사용할 수 있습니다.
if(obj.prop === undefined) console.log("The value is defined as undefined, or never defined");
거짓 값, 정의되지 않음, null 또는 정의되지 않음으로 정의됩니다.
일반적으로 사람들은 값이 falsy, undefined
또는 null
인지 알아내는 알고리즘을 요청했습니다. 다음 작품.
if(obj.prop == false || obj.prop === null || obj.prop === undefined) { console.log("The value is falsy, null, or undefined"); }
Travis
ECMAScript 10 은 객체가 다음과 같이 정의된 경우에만 객체의 속성을 사용하는 데 사용할 수 있는 선택적 연결 이라는 새로운 기능을 도입했습니다.
const userPhone = user?.contactDetails?.phone;
user 및 contactDetails가 정의된 경우에만 전화 속성을 참조합니다.
참조 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
Przemek Struciński
"propertyName" in obj //-> true | false
sam
솔루션이 잘못되었습니다. 자바스크립트에서,
null == undefined
둘 다 부울로 "캐스팅"되고 거짓이기 때문에 true를 반환합니다. 올바른 방법은 확인하는 것입니다
if (something === undefined)
ID 연산자는 무엇입니까?
Ricky
간결함을 위해 void 0
과 비교하십시오.
if (foo !== void 0)
if (typeof foo !== 'undefined')
만큼 장황하지 않습니다.
bevacqua
다음 코드를 사용하여 경로가 정의되지 않은 모든 배열을 얻을 수 있습니다.
function getAllUndefined(object) { function convertPath(arr, key) { var path = ""; for (var i = 1; i < arr.length; i++) { path += arr[i] + "->"; } path += key; return path; } var stack = []; var saveUndefined= []; function getUndefiend(obj, key) { var t = typeof obj; switch (t) { case "object": if (t === null) { return false; } break; case "string": case "number": case "boolean": case "null": return false; default: return true; } stack.push(key); for (k in obj) { if (obj.hasOwnProperty(k)) { v = getUndefiend(obj[k], k); if (v) { saveUndefined.push(convertPath(stack, k)); } } } stack.pop(); } getUndefiend({ "": object }, ""); return saveUndefined; }
jsFiddle 링크
Anoop
정의된 속성을 새 변수에 할당하는 멋지고 우아한 방법이 있습니다.
var a = obj.prop || defaultValue;
추가 구성 속성을 받는 함수가 있는 경우에 적합합니다.
var yourFunction = function(config){ this.config = config || {}; this.yourConfigValue = config.yourConfigValue || 1; console.log(this.yourConfigValue); }
지금 실행 중
yourFunction({yourConfigValue:2}); //=> 2 yourFunction(); //=> 1 yourFunction({otherProperty:5}); //=> 1
Marian Klühspies
모든 답변이 불완전합니다. 이것은 '정의되지 않은 것으로 정의된' 속성이 있음을 아는 올바른 방법입니다.
var hasUndefinedProperty = function hasUndefinedProperty(obj, prop){ return ((prop in obj) && (typeof obj[prop] == 'undefined')); };
예시:
var a = { b : 1, e : null }; ac = ad; hasUndefinedProperty(a, 'b'); // false: b is defined as 1 hasUndefinedProperty(a, 'c'); // true: c is defined as undefined hasUndefinedProperty(a, 'd'); // false: d is undefined hasUndefinedProperty(a, 'e'); // false: e is defined as null // And now... delete ac ; hasUndefinedProperty(a, 'c'); // false: c is undefined
이게 정답이고 오답에 묻혀서 아쉽다 >_<
그래서 지나가시는 분들을 위해 undefined를 무료로 드립니다!!
var undefined ; undefined ; // undefined ({}).a ; // undefined [].a ; // undefined ''.a ; // undefined (function(){}()) ; // undefined void(0) ; // undefined eval() ; // undefined 1..a ; // undefined /a/.a ; // undefined (true).a ; // undefined
Juan Garcia
제 상황은 다음과 같습니다.
REST 호출 결과를 사용하고 있습니다. 결과는 JSON에서 JavaScript 객체로 구문 분석되어야 합니다.
내가 변호해야 할 한 가지 오류가 있습니다. 사용자가 인수를 잘못 지정하는 한 REST 호출에 대한 인수가 잘못된 경우 REST 호출은 기본적으로 비어 있게 됩니다.
이 게시물을 사용하여 이에 대해 방어하는 동안 다음을 시도했습니다.
if( typeof restResult.data[0] === "undefined" ) { throw "Some error"; }
내 상황에서 restResult.data[0] === "object"이면 나머지 구성원 검사를 안전하게 시작할 수 있습니다. 정의되지 않은 경우 위와 같이 오류가 발생합니다.
내가 말하는 것은 내 상황에서 이 게시물의 모든 이전 제안이 작동하지 않았다는 것입니다. 내가 옳고 모두가 틀렸다고 말하는 것이 아니다. 저는 JavaScript 마스터는 아니지만 누군가에게 도움이 되기를 바랍니다.
wayneseymour
주석을 살펴보고 둘 다 확인하려는 사람들은 정의되지 않았거나 값이 null인지 확인합니다.
//Just in JavaScript var s; // Undefined if (typeof s == "undefined" || s === null){ alert('either it is undefined or value is null') }
jQuery 라이브러리를 사용하는 경우 jQuery.isEmptyObject()
두 경우 모두에 충분합니다.
var s; // Undefined jQuery.isEmptyObject(s); // Will return true; s = null; // Defined as null jQuery.isEmptyObject(s); // Will return true; //Usage if (jQuery.isEmptyObject(s)) { alert('Either variable:s is undefined or its value is null'); } else { alert('variable:s has value ' + s); } s = 'something'; // Defined with some value jQuery.isEmptyObject(s); // Will return false;
Angelin Nadar
Angular를 사용하는 경우:
angular.isUndefined(obj) angular.isUndefined(obj.prop)
밑줄.js:
_.isUndefined(obj) _.isUndefined(obj.prop)
Vitalii Fedorenko
이상한 대답을 기대하는 사람들을 위해 세 가지 방법을 제공합니다.
function isUndefined1(val) { try { val.a; } catch (e) { return /undefined/.test(e.message); } return false; } function isUndefined2(val) { return !val && val+'' === 'undefined'; } function isUndefined3(val) { const defaultVal = {}; return ((input = defaultVal) => input === defaultVal)(val); } function test(func){ console.group(`test start :`+func.name); console.log(func(undefined)); console.log(func(null)); console.log(func(1)); console.log(func("1")); console.log(func(0)); console.log(func({})); console.log(func(function () { })); console.groupEnd(); } test(isUndefined1); test(isUndefined2); test(isUndefined3);
정의되지 않음1:
입력 값의 속성을 가져오고 오류 메시지가 있으면 확인하십시오. 입력 값이 정의되지 않은 경우 오류 메시지는 Uncaught TypeError: Cannot read property 'b' of undefined 가 됩니다.
정의되지 않음2:
"undefined"
와 비교할 문자열로 변환하고 음수 값인지 확인합니다.
isUndefined3:
JavaScript에서 선택적 매개변수는 입력 값이 정확히 undefined
일 때 작동합니다.
blackmiaool
아주 쉽고 간단한 방법이 있습니다.
선택적 체인을 사용할 수 있습니다.
x = {prop:{name:"sajad"}} console.log(x.prop?.name) // Output is: "sajad" console.log(x.prop?.lastName) // Output is: undefined
또는
if(x.prop?.lastName) // The result of this 'if' statement is false and is not throwing an error
함수나 배열에 대해서도 선택적 연결을 사용할 수 있습니다.
2020년 중반 현재 이것은 보편적으로 구현되지 않습니다. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining 에서 설명서를 확인하십시오.
Sajad Saderi
if (this.variable)
를 사용하여 정의되었는지 테스트합니다. 이전 답변에서 권장되는 간단한 if (variable)
가 실패합니다.
변수가 어떤 객체의 필드인 경우에만 동작하는 것으로 밝혀졌고, 사전에 정의되어 있는지 확인하기 위해 obj.someField
그러나 내가 이해하는 바와 같이 모든 변수는 현재 창의 필드이므로 this
또는 window
를 사전 개체로 사용할 수 있습니다. 따라서 다음은 테스트입니다.
if (this.abc) alert("defined"); else alert("undefined"); abc = "abc"; if (this.abc) alert("defined"); else alert("undefined");
abc
가 정의되지 않았으며 초기화 후에 정의되었음을 감지합니다.
Val
function isUnset(inp) { return (typeof inp === 'undefined') }
변수가 설정되면 false를 반환하고 정의되지 않으면 true를 반환합니다.
그런 다음 다음을 사용하십시오.
if (isUnset(var)) { // initialize variable here }
Rixius
undefined
변수를 보호하기 위해 제가 사용하고 있는 것을 보여드리고 싶습니다.
Object.defineProperty(window, 'undefined', {});
window.undefined
값을 변경하는 것을 금지하므로 해당 변수를 기반으로 코드를 파괴합니다. "use strict"
경우 값을 변경하려는 모든 작업은 오류로 종료되고, 그렇지 않으면 자동으로 무시됩니다.
Seti
출처 : http:www.stackoverflow.com/questions/27509/detecting-an-undefined-object-property
'etc. > StackOverFlow' 카테고리의 다른 글
Python의 목록 메서드 추가와 확장의 차이점은 무엇입니까? (0) | 2021.10.26 |
---|---|
Pandas에서 DataFrame의 행을 반복하는 방법 (0) | 2021.10.26 |
SQL Server의 기존 테이블에 기본값이 있는 열 추가 (0) | 2021.10.26 |
의존성 주입이란? (0) | 2021.10.26 |
JavaScript에서 문자열을 부울로 변환하려면 어떻게 해야 합니까? (0) | 2021.10.26 |