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

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

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

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

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



답변

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

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

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

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

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

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

답변

객체에 물리적으로 @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

답변

Underscore.js 또는 Lodash

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

🙂


답변

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

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

답변

내 원래 코드의 한 가지 특징

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

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

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


답변

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