JavaScript에서 객체에 주어진 속성이 있는지 확인하는 방법


311

값에 관계없이 개체 x에 정의 된 속성이 있는지 여부를 어떻게 확인할 수 있습니까?yx.y

나는 현재 사용하고 있습니다

if (typeof(x.y) !== 'undefined')

그러나 그것은 약간 어수선 해 보입니다. 더 좋은 방법이 있습니까?

답변:


584

객체에는 속성이 있습니다.

프로토 타입 체인의 일부가 아닌 객체 자체에있는 속성을 테스트하는 경우 다음을 사용할 수 있습니다 .hasOwnProperty().

if (x.hasOwnProperty('y')) { 
  // ......
}

객체 또는 프로토 타입에는 다음과 같은 속성이 있습니다.

in연산자를 사용하여 상속 된 속성도 테스트 할 수 있습니다 .

if ('y' in x) {
  // ......
}

23
또는 Object.prototype.hasOwnProperty.call(x, 'y')"hasOwnProperty"라는 속성이 검사 프로세스와 충돌하지 않도록하기 위해 더 좋을 것입니다.)
kangax

4
또는 더 짧습니다 — {}.hasOwnProperty.call(x, 'y').
axmrnv

78

객체에 물리적으로 @gnarf의 답변이 포함되어 있는지 알고 싶다면 사용 hasOwnProperty하십시오.

객체 자체 또는 프로토 타입 체인의 어느 곳에 나 속성이 있는지 알고 싶다면 inoperator를 사용할 수 있습니다 .

if ('prop' in obj) {
  // ...
}

예 :

var obj = {};

'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically

18

Underscore.js 또는 Lodash

if (_.has(x, "y")) ...

:)


아니. 의 별칭 일뿐입니다 Object.prototype.hasOwnProperty.call(x, "y"). 배열의 당신이 할 수 있습니다 생각 Array.prototype.indexOf, _.indexOf또는_.contains
nackjicholson

13

다음과 같이 약간 잘라낼 수 있습니다.

if ( x.y !== undefined ) ...

15
x = {y:undefined}
James

20
"정의되지 않은"과 "정의되지 않은 것으로 정의 된"을 구별해야합니까?
jpsimons 2009

16
@darkporter 가끔;)
mmm

6

내 원래 코드의 한 가지 특징

if ( typeof(x.y) != 'undefined' ) ...

일부 상황에서 유용 할 수있는 것은 x존재 여부에 관계없이 사용하는 것이 안전하다는 것입니다 . gnarf 's answer의 방법 중 하나를 사용하면 먼저 x존재하는지 의심이 있는지 테스트해야 합니다.

따라서 아마도 세 가지 방법 모두 하나의 트릭에 자리 잡고 있습니다.


당신은 항상 사용할 수 있습니다 (x && x.hasOwnProperty('y'))또는(x && 'y' in x)
gnarf

x 테스트는 별도의 사례가되어야한다는 데 동의합니다. 또한 더 나은 오류보고 기능을 제공합니다.
b01

그것은 나를 위해 실패했습니다. x가 정의되어 있지 않으면 typeof (xy)는 ReferenceError문자열 'undefined'대신에 a를 반환합니다.
Craig

1

질문은 속성 검사의 어색함과 함수 인수 옵션 객체의 유효성 검사에 대한 일반적인 유스 케이스에 관한 것이기 때문에 여러 속성의 존재를 테스트하는 라이브러리가없는 짧은 방법을 언급 할 것이라고 생각했습니다. 면책 조항 : 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

-2

왜 간단하게 :

if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");

또는 특정 유형이 필요한 경우 :

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");

1
읽기가 어렵고 유형이 엄격하지 않기 때문입니다. 나는 당신에게 물어야합니다 : 왜 간단하지 x.hasOwnProperty('y')않습니까?
Fabian Picone
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.