자바스크립트에서 객체에 특정 프로퍼티가 있는지 확인하려면 어떻게 해야 하나요?

자바스크립트에서 객체에 특정 프로퍼티가 있는지 확인하려면 어떻게 해야 하나요?

생각해 보세요:

x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
    //Do this
}

이것이 가장 좋은 방법인가요?

질문에 대한 의견 (3)
해결책

39 m, 정말 너무 i& 의해 부여된 - 그냥 바로 답변 대부분이 잘못된. 물론 속성 값을 갖는 객체에는 정의되지 않은, null 또는 거짓값 할 수 있습니다. 그래서 간단하게 확인할 수 있어, 속성, 이 [속성] &lt 메리 페로프 &lt code&gt /code>; 또는,,, &lt 해도 그 code&gt x.key&lt /code&gt. 당신을 완전히 부여하느뇨 잘못된 결과를 얻을 수 있습니다.

39, re you& 의존하기 무엇을 찾고 있습니다. 개체의 경우 물리적으로 map_layer 궁금해할까봐 속성 (및 it is not coming up on the 곳에서 프로토타입 체인) 이면 &lt code&gt object.hasOwnProperty&lt /code>;;; 갈 길 입니다. 현대의 모든 브라우저에서 지원되는 것이 특징이다. (이는 누각되었습니다 그 이전 버전의 사파리 - 2.0.1 및 이전 버전의 브라우저 거의 사용되지 것이지만 이 더 이상.)

39 는 re 찾고 있다면 어떻게 you& 경우 등록 정보마다 객체에는 정보기술 (it), 즉 이트레이블 (객체의 속성을 반복할 때 나타납니다) 을 하고. 에 제안, /code&gt object&lt code&gt <;; 부여하느뇨 원하는 효과를 있습니다.

이후, code&gt &lt 사용하여 hasOwnProperty&lt /code>;; 요소라고 할 수 있는 방법, 내가 원하는 건 대체 할 수 있는 방식 그리웠댔지 너회들 다음 해결책:

var obj = {
    a: undefined,
    b: null,
    c: false
};

// a, b, c all found
for ( var prop in obj ) {
    document.writeln( "Object1: " + prop );
}

function Class(){
    this.a = undefined;
    this.b = null;
    this.c = false;
}

Class.prototype = {
    a: undefined,
    b: true,
    c: true,
    d: true,
    e: true
};

var obj2 = new Class();

// a, b, c, d, e found
for ( var prop in obj2 ) {
    document.writeln( "Object2: " + prop );
}

function hasOwnProperty(obj, prop) {
    var proto = obj.__proto__ || obj.constructor.prototype;
    return (prop in obj) &&
        (!(prop in proto) || proto[prop] !== obj[prop]);
}

if ( Object.prototype.hasOwnProperty ) {
    var hasOwnProperty = function(obj, prop) {
        return obj.hasOwnProperty(prop);
    }
}

// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
    if ( hasOwnProperty(obj2, prop) ) {
        document.writeln( "Object2 w/ hasOwn: " + prop );
    }
}

위의 크로스 브라우저 솔루션을 개발하고,,,, 한 &lt code&gt hasOwnProperty&lt /code&gt 경고: 원형 (prototype) 와 동급의 경우를 구별할 수 없다는 속성을 켜있을 인스턴스에 대한 - 그냥 # 39 의 프로토타입 오는 it& 가정합니다. 상황에 따라 엄격한 관대한 수 있도록, 또는 shift+ctrl 수 있지만, 최소한 더 도움됐네 되어야 합니다.

해설 (8)

1 와 ['언더스코엘가이스'] 또는 ([더욱] (https://stackoverflow.com/q/13789618/19212)) '로다시':

_.has(x, 'key');

그러나 (a) ',' 오브ject.프로토티페스트라운프로페티 페이징됩니다 입력할 수 있는 기간이 짧은, (b) ',' 안전한 참조입니다 해스운프로페티 &quot &quot 사용합니다. (즉 작동하잖아 해스운프로페티 경우에도 '' 덮어쓰여집니다).

특히 _.has 로다시 eventtest '' 다음과 같습니다.

   function has(object, key) {
      return object ? hasOwnProperty.call(object, key) : false;
   }
   // hasOwnProperty = Object.prototype.hasOwnProperty
해설 (10)
  • 참고 : 다음은 '와' 해스운프로페티 엄격한 모드를 크게 비활용 덕분에 요즘. 엄격한 모드를 사용할 수 있는 최적의 솔루션을 사용하여 속성 '및' 로비스트라운프로페티 존재를 확인할 수 있습니다. 이런 것들을 모두 적어도 이 대답 * 선행 널리 구현됩니까 있다 (예, 것은 이전). 시행하십시오 같은 역사적 참고.

'한 것은 정의되지 않은' 가 있다는 것을 명심해야 (외람되나) JavaScript 에서 예약어입니다 엄격한 모드를 사용하지 않는 경우. 따라서 누군가 (다른 사람이, 분명히) 할 생각을 이 코드에 천불이야 재정의하지 돌파했다.

따라서 보다 강력한 방법은 다음과 같습니다.

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

또한, 이 방법은 대한 자세한 정보 및 때는기대어 뒤집기 훨씬 더 느리게 간다. :-/

    • 사실 수 있도록 공통 대안은 있다 '는' 에 의해 정의되지 않은 코드를 함수가 undefined, 예를 들어 추가로 매개변수에서 정의되지 않은 ',' 하지 않는 것을 허용하는 법안을 값입니다. 이건 그냥 전화할 수 있도록 값을 직접 전달되지 않은 즉시 예:
(function (undefined) {
    … your code …
    if (x.attribute !== undefined)
        … mode code …
})();
해설 (9)

뭐 어때?

var x = {'key': 1};

if ('key' in x) {
    console.log('has');
}
해설 (4)
if (x.key !== undefined)

아민 로나허가 이미 저보다 앞서서 이 문제를 해결한 것 같지만요:

Object.prototype.hasOwnProperty = function(property) {
    return this[property] !== undefined;
};

x = {'key': 1};

if (x.hasOwnProperty('key')) {
    alert('have key!');
}

if (!x.hasOwnProperty('bar')) {
    alert('no bar!');
}

콘라드 루돌프]4아르민 로나허가 지적한 것처럼3 더 안전하지만 느린 해결책이 될 것입니다:

Object.prototype.hasOwnProperty = function(property) {
    return typeof this[property] !== 'undefined';
};
해설 (4)

작동 여부를 확인할 수 있는 '에서 사용할 수 있습니다' 객체에 대한 속성:

x = {'key': 1};
alert("key" in x);

또한, 즉 '루프 (loop)' 을 통해 모든 객체의 속성을 사용하여 확인할지 후 특정 속성:

for (prop in x) {
    if (prop == "key") {
        //Do something
    }
}

이 때문에 비사양 열거 특성을 고려해야 합니다 표시되지 않을 경우 객체에는 열거 방관하겠나 속성은 '에 대한 인' 루프지 또한, 만약 한 열거 속성은 섀도잉 비사양 열거 재산에 원형 (prototype), it 에 표시되지 않을 internet&amp explorer&; 빨리, 빨리, 8 와 있다.

하려면 모든 인스턴스 속성을 목록을 열거 방관하겠나 관계없이 사용할 수 있습니다.

Object.getOwnPropertyNames(x);

이 반환되므로 배열입니다 객체를 존재하는 모든 속성의 이름을.

마지막으로, 수행되는 연산자입니다 확인란 객체의 데이터 유형이 속성을 직접 사용할 수 있습니다.

if (typeof x.key == "undefined") {
    alert("undefined");
}

String 객체에 대한 속성 존재하지 않는 경우, 이 반환되므로 정의되지 않았습니다. 또 다른 반품해야 적절한 속성 유형. 그러나 이것이 유효한 방법이 있는지 확인하는 것이 항상 충족되었으며 객체에는 속성 속성 때문에 방관하겠나 외상때문에 정의되지 않은, 이 경우 '으로 설정된 사용하여 메리 페로프 여전히 스스키 복귀하십시오' true (경우에도 여전히 주요 객체에는).

업데이트: Javascript 를 비교하여 정의되지 않은 속성 속성 존재 여부를 확인할 수 있습니다.

if (x.key === undefined) {
    alert("undefined");
}

이 경우는 특별히 노력해야 한다는 것은 정의되지 않은 '의' x 객체에는 설정되었습니다 키

해설 (2)

39 의 잘라냅니다 let& 통해 일부 혼란이 삽입하십시오. 첫째, let& # 39 에 의해 '가정' 해스운프로페티 단순화하십시오 이미. 현재 브라우저의 사용 중 대부분은 마찬가지입니다.

이름이 '속성' 해스운프로페티 되돌려줍니다 전달할 수 있으면 참 추가되었음 객체에는. 이것은 완전히 독립적으로 실제값 할당되어 정의되지 않은 '정확히' 있을 수 있음.

  • Hence:*
var o = {}
o.x = undefined

var a = o.hasOwnProperty('x')  // a is true
var b = o.x === undefined // b is also true
  • However:*
var o = {}

var a = o.hasOwnProperty('x')  // a is now false
var b = o.x === undefined // b is still true

문제는 객체의 속성을 가지고 있을 때 일어나는 프로토타입 (chain) 의 값이 정의되지 않은? '거짓' 을 위한 정보기술 (it), '! = 정의되지 않은' 해스운프로페티 있을 것입니다. 그러나 여전히 'for.in' 은 이 열거도 목록.

The bottom line 은 크로스 브라우저 운행에서어떠한 없다 (이후 '노출' prototype Internet&amp doesn& # 39, t, nbsp, Explorer) 것을 확인할 수 있는 객체 또는 어떤 특정 식별자입니다 프로토타입 체인으로 연결된 적이 있다.

해설 (0)

속성에 대해 검색하였다면 관심용 NO&quot ";). 운영까지도:

if ('prop' in obj) { }

일반적으로 원형 (prototype) 또는 객체에는 등록 여부를 잘 안됩니다 비롯됩니다.

그러나 # 39, & # 39 key& 사용할 수 있기 때문에, 마치 틀렸다니까 로케이터로 다룰 수 있는 샘플 코드, 해시, 이 경우 대답을 할 것이라고 한다. 모든 해시 키를 약간만이라도 속성에 의해 평가를 받고 있으며, 추가 특성는 프로토타입 객체에는 방지할 수 있습니다.

존 Resig& # 39 는 아주 포괄적인 있지만, s, t # 39 죽여줬어 wasn& 답을 줄 알았는데. # 39, & # 39 prop& 함께 사용하는 경우, 특히 &quot. 의 obj".

해설 (3)

간단한 테스트를 위한 객체에는 사용:

  • 'if (obj [x]! = 정의되지 않은)' *

39, object type t know what it don& 경우 이용하는 것입니다.

  • 'if (로비스트라운프로페티 (x))' *

다른 모든 옵션을 속도가 느려집니다.

  • 세부내용에서 *

성능 평가에 따라 다른 노데지스 100,000,000 주기 위해 5 제안한 옵션이 있습니다.

function hasKey1(k,o) { return (x in obj); }
function hasKey2(k,o) { return (obj[x]); }
function hasKey3(k,o) { return (obj[x] !== undefined); }
function hasKey4(k,o) { return (typeof(obj[x]) !== 'undefined'); }
function hasKey5(k,o) { return (obj.hasOwnProperty(x)); }

우리는 특히 있음을 알려 준다는 평가를 한 확인하려는 object& # 39 의 프로토타입 체인을 사용하여 객체에는 자체를 하지 않고 있을 뿐 아니라 일반 양식: It if (X) 의 Obj) '.' 는 2 대 6 번 사이에 느린 따라 览侩 荤례

hasKey1 execution time: 4s 510.427785ms
hasKey2 execution time: 0s 904.374806ms
hasKey3 execution time: 0s 760.336193ms
hasKey4 execution time: 0s 935.19901ms
hasKey5 execution time: 2s 148.189608ms

요컨대, Obj 경우 simple object 아니다 # 39 의 프로토타입 체인 및 검사 및 프로파일링하려는 object& 피할 수 있도록 직접 소유하고 있고, 사용 및 # 39 개 목표 (로비스트라운프로페티 (x)), 만약 .& # 39;.

그렇지 않으면 simple object 와 object& # 39 에 대한 우려가 없는 사용할 때 사용하는 경우, 프로토타입 체인 ' (메리 페로프 (obj [x]), # 39, & # 39 undefined&! =).' 가장 안전한 및 빠른 방법입니다.

간단한 해시 테이블을 사용하는 경우, "만약 내가 아무 짓도 안 로케이터로 등으로 사용하게 된다. (obj [x]) '를 찾아 내가 훨씬 더 판독값.

즐거운 시간 되세요

해설 (1)

네, 맞습니다 :) 'x'에 'hasOwnProperty'라는 프로퍼티가 있는 경우에도 Object.prototype.hasOwnProperty.call(x, 'key')을 할 수 있을 것 같습니다 :)

하지만 이는 자체 프로퍼티를 테스트합니다. 내재된 프로퍼티가 있는지 확인하려면 typeof x.foo != 'undefined'를 사용하면 됩니다.

해설 (0)

'이' 객체에는 ES6 설명하노라 을 사용할 수도 있습니다.

x = {'key': 1};
Reflect.has( x, 'key'); // returns true

'' 에 관한 문서가 매든 세레스트리아스 korea. 여기서요 .

&gt. 이 같은 방식은 '정적' 세레스트리아스 () 함수로 in 작동자.

해설 (0)
if (typeof x.key != "undefined") {

}

때문에

if (x.key)

실패할 경우 '를' 스스키 보정됩니다 '거짓' (예를 들어, &quot 스스키 = &quot ',').

해설 (1)

상속된 자산을 원하지 않는다면 제가 정답을 맞힌 것 같습니다:

if (x.hasOwnProperty('key'))

다음은 상속된 속성을 포함할 수 있는 몇 가지 다른 옵션입니다:

if (x.key) // Quick and dirty, but it does the same thing as below.

if (x.key !== undefined)
해설 (3)

이렇게 하지 '오브ject.하스운프로페티 (키))', 그 때문에 이러한 방식이 그렇게 안 될 문제가 있는 객체에 대한 등록 정보순으로 그림자 ' {포지셔닝합니다 해스운프로페티: 객체에는 거짓값} '또는' (오브ject.크레이트 (null)) 'null 개체 수 있습니다.

가장 좋은 방법은 오브ject.프로토티페스트라운프로페티스콜 못하며창조된 ' (오브젝트, 키)' 또는 '.

const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
/* or */
import has from 'has'; // https://www.npmjs.com/package/has
// ...
console.log(has.call(object, key));
해설 (1)

해스운프로페티 &quot 여부를 결정하는 데 사용될 수 있습니다, 지정된 해당 객체의 속성 속성 객체에는 직접판매용 있다. 에서 달리, 이 방법은 작동자 # 39 의 프로토타입 chain.&quot object& 아래로 확인하지 않습니다.

그래서 대부분의 아마도 뭐하러요 질문을 통해 사용할 수 없는 것 같다, don& # 39 로 존재하는 경우 직접 결정하는 해스운프로페티 속성 자체가 , 첨부되었는지 객체에는.

스케쳐내 프로토타입 체인 너회가 주 에서 사용할 수 있는지 여부를 결정할 수 있는 속성, 다음과 같습니다.

if( prop in object ){ // do something }

이렇게 하면 좋겠다.

해설 (1)

비교적 간단한 방법으로 사용하고 다른 '로비치스키스'. 이 '즉' 을 반환하는지 어레이입니다 어레이에서는 기능을 모두 활용할 수 있습니다.

var noInfo = {};
var info = {something: 'data'};

Object.keys(noInfo).length //returns 0 or false
Object.keys(info).length //returns 1 or true

비록 지금은 세계 뛰어난 브라우저 지원. 이 질문은 너무 오래된 생각해봤죠 I&; d # 39 이 때문에 추가: 이것은 [JS v1.8.5] [2] vmware. 안전하게 사용할 수 있습니다

[2]: # 로비치스키스 http://kangax.github.io/compat-table/es5/

해설 (2)

여기에 또 다른 옵션은 구체적 사건에 대한 위험이 있는 벽돌이날아와 다운보팅. )

스케쳐내 테스트하려면 멤버 및 it 설정되었습니다 이외의 다른 객체에 대한 있는건가요.

  • & # 39, & # 39.
  • 거짓값
  • null
  • undefined
  • 0 .

그 후 사용할 수 있습니다.

var foo = {};
foo.bar = "Yes, this is a proper value!";
if (!!foo.bar) {
        // member is set, do something
}
해설 (2)

다음과 같은 방식을 사용할 수 있습니다 -

var obj = {a:1}
console.log('a' in obj)               //1
console.log(obj.hasOwnProperty('a'))  //2
console.log(Boolean(obj.a))         //3

이 차이를 다음과 같이 다음 접근 방식은 -

  1. 우리는 단지 그것의 객체에는 검색 1 위 및 3rd 외곽진입 프로토 타입 체인 너무. 하지만 만약 객체가 속성을 가지고 있지 않습니다. 프로토타입 체인에 존재하는 것인지 열거하십시오 속성이 있다. 참.

<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. &gt 거짓값 -;

 var obj = {
      a:2,
      __proto__ :{b:2}
    }

    console.log('b' in obj)
    console.log(Boolean(obj.b))

끝 - &lt 스니핏 >;!

  1. 2 외곽진입 대해서만 확인할 자체 이다. Ex -

<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. &gt 거짓값 -;

var obj = {
      a:2,
      __proto__ :{b:2}
    }

    console.log(obj.hasOwnProperty('b'))

끝 - &lt 스니핏 >;!

  1. 제 1 · 3 은 디스크입니다. diskid 속성 값 차이는 있을 경우 정의되지 않은 the 3rd 외곽진입 전달자로써 진정한 첫 부여하느뇨 거짓값 동시에 진행되고 있다.

<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. &gt 거짓값 -;

var obj = {
      b : undefined
    }
    console.log(Boolean(obj.b))
    console.log('b' in obj);

끝 - &lt 스니핏 >;!

해설 (1)

Hasownproperty&quot &quot 메서드로부터 있습니다;; 그러나 그 때문에 이 방법을 직접 호출할 수 있는 개체 수 없는 권장됨 가끔 객체에는 널임 또는 어떤 부동산 존재하는 개체 다음과 같습니다. ' {해스운프로페티: 거짓값} '

그래서 더 나은 방법이 될 것 "이라고 말했다.

<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. &gt 거짓값 -;

// good
var obj = {"bar": "here bar desc"}
console.log(Object.prototype.hasOwnProperty.call(obj, "bar"));

// best
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
console.log(has.call(obj, "bar"));

끝 - &lt 스니핏 >;!

해설 (0)

ECMA 스크립트 6 솔루션과 숙고하리라 다음과 같은 래퍼 생성

/**
Gets an argument from array or object.
The possible outcome:
- If the key exists the value is returned.
- If no key exists the default value is returned.
- If no default value is specified an empty string is returned.
@param obj    The object or array to be searched.
@param key    The name of the property or key.
@param defVal Optional default version of the command-line parameter [default ""]
@return The default value in case of an error else the found parameter.
*/
function getSafeReflectArg( obj, key, defVal) {
   "use strict";
   var retVal = (typeof defVal === 'undefined' ? "" : defVal);
   if ( Reflect.has( obj, key) ) {
       return Reflect.get( obj, key);
   }
   return retVal;
}  // getSafeReflectArg
해설 (2)