답변:
프로토 타입 체인의 일부가 아닌 객체 자체에있는 속성을 테스트하는 경우 다음을 사용할 수 있습니다 .hasOwnProperty()
.
if (x.hasOwnProperty('y')) {
// ......
}
in
연산자를 사용하여 상속 된 속성도 테스트 할 수 있습니다 .
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y')
.
객체에 물리적으로 @gnarf의 답변이 포함되어 있는지 알고 싶다면 사용 hasOwnProperty
하십시오.
객체 자체 또는 프로토 타입 체인의 어느 곳에 나 속성이 있는지 알고 싶다면 in
operator를 사용할 수 있습니다 .
if ('prop' in obj) {
// ...
}
예 :
var obj = {};
'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically
Underscore.js 또는 Lodash
if (_.has(x, "y")) ...
:)
Object.prototype.hasOwnProperty.call(x, "y")
. 배열의 당신이 할 수 있습니다 생각 Array.prototype.indexOf
, _.indexOf
또는_.contains
다음과 같이 약간 잘라낼 수 있습니다.
if ( x.y !== undefined ) ...
x = {y:undefined}
내 원래 코드의 한 가지 특징
if ( typeof(x.y) != 'undefined' ) ...
일부 상황에서 유용 할 수있는 것은 x
존재 여부에 관계없이 사용하는 것이 안전하다는 것입니다 . gnarf 's answer의 방법 중 하나를 사용하면 먼저 x
존재하는지 의심이 있는지 테스트해야 합니다.
따라서 아마도 세 가지 방법 모두 하나의 트릭에 자리 잡고 있습니다.
(x && x.hasOwnProperty('y'))
또는(x && 'y' in x)
ReferenceError
문자열 'undefined'대신에 a를 반환합니다.
질문은 속성 검사의 어색함과 함수 인수 옵션 객체의 유효성 검사에 대한 일반적인 유스 케이스에 관한 것이기 때문에 여러 속성의 존재를 테스트하는 라이브러리가없는 짧은 방법을 언급 할 것이라고 생각했습니다. 면책 조항 : ECMAScript 5가 필요합니다 (그러나 여전히 IE8을 사용하는 사람은 누구나 웹이 망가질 수 있습니다).
function f(opts) {
if(!["req1","req2"].every(opts.hasOwnProperty, opts)) {
throw new Error("IllegalArgumentException");
}
alert("ok");
}
f({req1: 123}); // error
f({req1: 123, req2: 456}); // ok
왜 간단하게 :
if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");
또는 특정 유형이 필요한 경우 :
if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
x.hasOwnProperty('y')
않습니까?
Object.prototype.hasOwnProperty.call(x, 'y')
"hasOwnProperty"라는 속성이 검사 프로세스와 충돌하지 않도록하기 위해 더 좋을 것입니다.)