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");
}
undefined
x 객체에 키가 특별히 설정되어 있지 않으면 작동 합니다.
답변
여기에 약간의 혼란을 줄이자. 먼저, 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__
특정 식별자가 프로토 타입 체인의 객체 또는 다른 것에 부착되지 않았 음을 확인하는 것입니다.