[javascript] JavaScript에서 객체에 특정 속성이 있는지 어떻게 확인합니까?

JavaScript에서 객체에 특정 속성이 있는지 어떻게 확인합니까?

치다:

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

그것이 최선의 방법입니까?



답변

나는 주어진 답변에 정말 혼란 스럽습니다. 대부분의 답변은 완전히 틀 렸습니다. 물론 정의되지 않은, null 또는 false 값을 가진 개체 속성을 가질 수 있습니다. 따라서 속성 확인을 typeof this[property]줄이거 나 더 나쁜 것은 x.key완전히 잘못된 결과를 초래할 수 있습니다.

찾고있는 내용에 따라 다릅니다. 객체에 물리적으로 속성이 포함되어 있는지 (그리고 프로토 타입 체인의 어딘가에서 나오지 않는지) 알고 싶다면 object.hasOwnProperty갈 길입니다. 모든 최신 브라우저가이를 지원합니다. (이전 버전의 Safari-2.0.1 이상에서는 누락되었지만 해당 버전의 브라우저는 더 이상 사용되지 않습니다.)

찾고있는 것이 객체에 반복 가능한 속성이있는 경우 (객체의 속성을 반복 할 때 나타납니다) 다음을 수행 prop in object하면 원하는 효과 가 나타납니다 .

사용하는 hasOwnProperty것이 아마도 당신이 원하는 것이며, 대체 방법을 원할 것이라고 생각하기 때문에 다음 해결책을 제시합니다.

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 );
    }
}

위의 내용은 hasOwnProperty하나의 경고와 함께 작동하는 크로스 브라우저 솔루션 입니다. 프로토 타입과 인스턴스에 동일한 속성이있는 경우를 구별 할 수는 없으며 프로토 타입에서 온 것으로 가정합니다. 상황에 따라 좀 더 관대하거나 엄격하게 바꿀 수 있지만 최소한 더 도움이 될 것입니다.


답변

와 함께 Underscore.js또는 ( 더 나은 ) lodash:

_.has(x, 'key');

어떤 호출 Object.prototype.hasOwnProperty이지만 (a) 입력하기가 더 짧고 (b) “안전 참조 hasOwnProperty“를 사용합니다 (즉, hasOwnProperty덮어 쓴 경우에도 작동 함 ).

특히 lodash는 다음 _.has과 같이 정의 합니다.

   function has(object, key) {
      return object ? hasOwnProperty.call(object, key) : false;
   }
   // hasOwnProperty = Object.prototype.hasOwnProperty


답변

이건 어떤가요?

var x = {'key': 1};

if ('key' in x) {
    console.log('has');
}


답변

참고 : 다음은 현재 엄격 모드로 인해 더 이상 사용되지 않습니다 hasOwnProperty. 올바른 해결책은 엄격 모드를 사용하고을 사용하여 속성이 있는지 확인하는 것 obj.hasOwnProperty입니다. 이 답변 은 적어도 광범위하게 구현 된 것처럼이 두 가지 보다 앞서 있습니다 (그렇습니다. 다음을 역사적 메모로 사용하십시오.


엄격 모드를 사용하지 않는 경우 JavaScript에서 예약어가 아님을undefined 유감스럽게 생각 하십시오. 따라서 누군가 (다른 사람은 분명히) 그것을 재정의하고 코드를 깨뜨리는 위대한 아이디어를 가질 수 있습니다.

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

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

반대로,이 방법은 훨씬 더 장황하고 느립니다. :-/

일반적인 대안은 값이 전달되지 않는 추가 매개 변수 ()를 허용하는 함수에 코드를 삽입하여 실제로 정의되지 않은 것을 확인하는 것 undefined입니다 . 값이 전달되지 않도록하려면 다음과 같이 즉시 직접 호출하면됩니다.undefined

(function (undefined) {
     your code 
    if (x.attribute !== undefined)
         mode code 
})();


답변

if (x.key !== undefined)

Armin Ronacher 는 이미 저를 이겼습니다 .

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!');
}

안전하고 있지만, 느린 솔루션, 지적 으로 콘라드 루돌프아르 민 Ronacher 될 것이다 :

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


답변

in연산자를 사용하여 속성이 객체에 존재하는지 확인할 수 있습니다 .

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

루프를 사용하여 객체의 모든 속성을 for - in반복 한 다음 특정 속성을 확인할 수도 있습니다.

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

열거 할 수없는 속성은 for-in루프에 표시되지 않으므로이 개체 속성을 열거 할 수 있는지 고려해야합니다 . 또한 열거 가능한 속성이 프로토 타입의 열거 할 수없는 속성을 음영 처리하는 경우 Internet Explorer 8 및 이전 버전 에는 표시되지 않습니다 .

열거 가능 여부에 관계없이 모든 인스턴스 속성 목록을 원할 경우

Object.getOwnPropertyNames(x);

객체에 존재하는 모든 속성의 이름 배열이 반환됩니다.

마지막으로 typeof 연산자를 사용하여 객체 속성의 데이터 유형을 직접 확인할 수 있습니다.

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

속성이 개체에 없으면 문자열 undefined를 반환합니다. 그렇지 않으면 적절한 속성 유형을 반환합니다. 그러나 객체에 속성이 있는지 여부를 확인하는 올바른 방법은 아닙니다. 정의되지 않은 속성을 설정할 수 있기 때문에 typeof x.key키를 계속 사용하더라도 여전히 true를 반환합니다. 개체에서).

업데이트 : 정의되지 않은 자바 스크립트 속성과 비교하여 속성이 존재하는지 확인할 수 있습니다

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

undefinedx 객체에 키가 특별히 설정되어 있지 않으면 작동 합니다.


답변

여기에 약간의 혼란을 줄이자. 먼저, hasOwnProperty이미 존재 한다고 가정하여 단순화합시다 . 이것은 현재 사용중인 대다수의 현재 브라우저에 해당됩니다.

hasOwnProperty전달 된 속성 이름이 객체에 추가 된 경우 true를 반환합니다. 정확히 할당 된 실제 값과는 완전히 독립적입니다 undefined.

그 후:

var o = {}
o.x = undefined

var a = o.hasOwnProperty('x')  // a is true
var b = o.x === undefined // b is also true

하나:

var o = {}

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

문제는 프로토 타입 체인의 객체에 정의되지 않은 값의 속성이있는 경우 어떻게됩니까? hasOwnProperty그것에 대해 거짓이 될 것 !== undefined입니다. 그러나 for..in여전히 열거 형에 나열합니다.

결론은 Internet Explorer가 노출하지 않기 때문에 브라우저 간 방법이 없기 때문에 __prototype__특정 식별자가 프로토 타입 체인의 객체 또는 다른 것에 부착되지 않았 음을 확인하는 것입니다.