JavaScript에 객체에 속성이 있는지 확인하는 방법은 무엇입니까?


167

내가 선언한다고 가정

var ad = {}; 

이 객체에 사용자 정의 속성이 포함되는지 여부를 어떻게 확인할 수 있습니까?

답변:


86

다음과 같이 객체의 속성을 반복 할 수 있습니다.

for(var prop in ad) {
    if (ad.hasOwnProperty(prop)) {
        // handle prop as required
    }
}

hasOwnProperty()객체가 지정된 속성을 직접 속성으로 가지고 있고 객체의 프로토 타입 체인에서 상속되지 않는지 여부를 판별 하려면 메소드 를 사용하는 것이 중요합니다 .

편집하다

주석에서 : 해당 코드를 함수에 넣고 주석 이있는 부분에 도달하자마자 false를 반환하도록 할 수 있습니다

성능 테스트

속성을 테스트 할 때 Object.Keys 대 For..In 테스트


2
안녕하세요 Daniel, 실제로 객체에 사용자 정의 속성이 포함되어 있는지 여부를 확인하는 장치를 찾고 있습니다. 특정 속성이 존재하는지 확인하지 않습니다.
Ricky

7
@Ricky : 함수에 해당 코드를 넣고 주석이있는 부분에 도달하자마자 false를 반환하도록 할 수 있습니다.
Daniel Vassallo

8
요즘 사용하는 Object.keys것이 가장 쉬운 방법 이라고 생각합니다 . var a = [1,2,3];a.something=4;console.log(Object.keys(a))이미 ECMA 5에 포함되어 있으므로 안전하게 사용할 수 있습니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
HMR

2
ES5에서 "요즘"기본 개체는 열거 할 수없는 고유 속성을 가질 수 있습니다 (예 :) Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'}).
RobG

2
이 솔루션은 존재하는 키확인 하는 방법 이지만 Object.keys (x) .length를 사용하면 정확하고 효율적이며 가장 정확한 답변이 아래에 있습니다. 당신은 자신의 기능을 만들 필요가 없습니다, 이미 존재합니다!
dudewad

193

내장 Object.keys메소드를 사용하여 객체의 키 목록을 가져 와서 길이를 테스트 할 수 있습니다.

var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values

if(Object.keys(x).length > 0){
 // Your code here if x has some properties  
}

14
바로 여기 에 정답이 있습니다. 위의 대답은 해결 방법이며 키 수를 확인하는 것보다 비쌉니다. 이것은 더 의미가 있습니다.
dudewad

6
Object.keys ( "mystring"); 바람직하지 않은 키도 생성합니다. 이 답변은 내 의견으로는 불완전합니다.
Mike de Klerk

2
@MikedeKlerk Object.keys ( "mystring")가 아니라는 것을주의해서 읽어주십시오. 객체의 모든 키 배열을 반환하는 Object.keys (objectVariableName)입니다. 예 : { 'x': 'abc', 'y': 'def'} [ 'x', 'y']
Dhaval Chaudhary

3
@DhavalChaudhary 내 의견에 답장을 보내 주셔서 감사합니다. 이 코드를 시도 var str = "MyString"; Object.keys(str);하면 콘솔은 각 문자에 대해 0에서 7까지 8 개의 키를 출력합니다. 아니면 여전히 답을 이해하지 못합니까?
Mike de Klerk

6
@MikedeKlerk 그러나 문자열 pls가 아닌 객체에 대한 솔루션만이 질문을합니다.
Dhaval Chaudhary

111

간단한 기능을 만드는 것은 어떻습니까?

function isEmptyObject(obj) {
  for(var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
      return false;
    }
  }
  return true;
}

isEmptyObject({}); // true
isEmptyObject({foo:'bar'});  // false

hasOwnProperty직접 호출 하는 메소드 Object.prototype안전성을 조금만 높이는 것입니다 . 일반 obj.hasOwnProperty(...)호출을 사용하여 다음을 상상하십시오 .

isEmptyObject({hasOwnProperty:'boom'});  // false

주 : (미래에 대한) 위의 방법은에 의존 for...in문이 문은 반복 처리 열거 프로그래머가 아닌 열거 속성을 만들 수있는 방법이없는 현재 가장 널리 구현 인 ECMAScript 표준 (제 3 판)에서 속성을 .

그러나 이제 ECMAScript 5th Edition 에서 변경되었으며 열거 가능하지 않거나 쓰기 가능하지 않거나 삭제할 수없는 속성을 만들 수 있으므로 위의 방법 이 실패 할 수 있습니다 . 예 :

var obj = {};
Object.defineProperty(obj, 'test', { value: 'testVal', 
  enumerable: false,
  writable: true,
  configurable: true
});
isEmptyObject(obj); // true, wrong!!
obj.hasOwnProperty('test'); // true, the property exist!!

이 문제에 대한 ECMAScript 5 솔루션은 다음과 같습니다.

function isEmptyObject(obj) {
  return Object.getOwnPropertyNames(obj).length === 0;
}

Object.getOwnPropertyNames메소드는 모든Array 이름을 포함 하는를 반환 합니다 자신의 속성 오브젝트의 열거 여부는 ,이 방법은 크롬 5 베타와 웹킷 박 빌드 최근에 이미, 브라우저 벤더에 의해 지금 시행되고있다.

Object.defineProperty 해당 브라우저 및 최신 Firefox 3.7 Alpha 릴리스에서도 사용할 수 있습니다.


1
obj.hasOwnProperty (prop)보다 Object.prototype.hasOwnProperty.call (obj, prop)의 장점은 무엇입니까?
Casey Chu

3
@Casey, 편집, 객체가 hasOwnProperty속성을 재정의하면 함수가 충돌 할 수 있습니다 ... 나는 약간 편집증 적 인 것을 알고 있지만 때로는 어떤 환경에서 코드가 사용 될지 알지 못하지만 당신은 어떤 방법을 사용하고 싶은지 알고 있습니다.
CMS

2
이 질문에 대한 답을 +1하고 미래의 다른 질문에 답하십시오! :)
Daniel Vassallo

1
IE에서 열거 할 수없는 속성과 일치하는 이름을 가진 속성이 있으면에 Object.prototype의해 열거되지 않는 버그가 있습니다 for...in. 따라서 isEmptyObject({toString:1})실패합니다. 이것은 당신이 할 수없는 불행한 이유 중 하나입니다 사용하는 Object범용 매핑한다.
bobince

1
@ MichaelMartin-Smucker— 는 열거 가능한 자체 속성 만 반환하므로 여기에 적합하지 않습니다.
RobG

58

으로 jQuery를 사용하면 사용할 수 있습니다 :

$.isEmptyObject(obj); // Returns: Boolean

jQuery 1.4부터이 메소드는 객체 자체의 속성과 프로토 타입에서 상속 된 속성 (hasOwnProperty를 사용하지 않음)을 모두 확인합니다.

인 ECMAScript 5 판 현대적인 브라우저 (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) 당신은 내장 사용할 수 있습니다 Object.keys의 방법 :

var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;

또는 평범한 오래된 JavaScript :

var isEmpty = function(obj) {
               for(var p in obj){
                  return false;
               }
               return true;
            };



11

lodash를 기꺼이 사용 하려는 경우이some 방법을 사용할 수 있습니다 .

_.some(obj) // returns true or false

이 작은 jsbin 예제를 참조하십시오


var x = [1,2] // true
djv

@ damionjn 예제에 코드를 추가했습니다. 배열에서 잘못된 대답을 반환하는 요점을 알지만 OP는 처음에 변수를 객체로 선언했기 때문에 이것을 가정한다고 생각합니다. 밑줄 isEmpty 메소드를 사용하는 위의 답변이 있습니다 (lodash는 동일한 메소드를 가짐). 그 대답은 똑같은 문제가 있습니다. isEmpty에 비어 있지 않은 배열을 제공하면 잘못된 결과도 얻을 수 있습니다.
sfs

충분히 공평하지만 모범 사례를 확실히하기 위해 모든 기반에 대한 답변을 제공해야합니다. 네 말이 맞아, 나는 비평없이 그의 대답으로 바로 통과했다. 지나가는 사람에게는 객체 전용 메소드가 아닙니다. _.some([1, 2]) // true 먼저 확인하십시오 : stackoverflow.com/a/13356338/1922747
djv

5
for (var hasProperties in ad) break;
if (hasProperties)
    ... // ad has properties

안전해야하고 객체 프로토 타입을 확인해야하는 경우 (이것은 특정 라이브러리에 의해 추가되며 기본적으로 추가되지 않음) :

var hasProperties = false;
for (var x in ad) {
    if (ad.hasOwnProperty(x)) {
        hasProperties = true;
        break;
    }
}
if (hasProperties)
    ... // ad has properties

1
솔루션에 원치 않는 프로토 타입 속성에 대한 필터링이 없으므로 Prototype.js와 같은 라이브러리를 사용하거나 경험이없는 사용자가 추가 프로토 타입 속성을 객체에 추가했을 때 오작동 할 수 있습니다. 이 페이지에서 Daniels 솔루션을 확인하십시오.
Joscha

객체의 프로토 타입을 확장하기 위해 라이브러리를 사용하거나 경험이 없어도됩니다. 일부 숙련 된 프로그래머는 항상이 작업을 수행합니다.
Alsciende

2
for(var memberName in ad)
{
  //Member Name: memberName
  //Member Value: ad[memberName]
}

멤버는 멤버 속성, 멤버 변수를 의미합니다.> _>

위의 코드는 toString을 포함한 모든 것을 반환합니다. 객체의 프로토 타입이 확장되었는지 확인하려는 경우 :

var dummyObj = {};  
for(var memberName in ad)
{
  if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A
  //Member Name: memberName
  //Member Value: ad[memberName]

}

참고 A : 더미 객체의 멤버가 테스트 객체의 멤버와 동일한 유형인지 확인합니다. 그것이 확장이라면, 더미 객체의 멤버 타입은 "정의되지 않아야한다"


안녕하세요, 객체에 속성이 있는지 여부를 알 수 있습니까? 감사합니다
Ricky

솔루션에 원치 않는 프로토 타입 속성에 대한 필터링이 없으므로 Prototype.js와 같은 라이브러리를 사용하거나 경험이없는 사용자가 추가 프로토 타입 속성을 객체에 추가했을 때 오작동 할 수 있습니다.
Joscha

이 페이지에서 Daniels 솔루션을 확인하십시오-오류가 덜 발생합니다!
Joscha

2
첫 번째 코드 블록은 전혀 다루지 않습니다. 정의되지 않은 "ad"객체에 변수를 추가하면 두 번째 코드 블록이 잘못 작동합니다. 실제로 "hasOwnProperty"라는 기본 구현을 사용하므로 다니엘스의 답변을 확인하십시오.
Joscha

@Ricky : 객체에 속성이 포함되어 있는지 확인하려면 내 대답에 예제를 사용하십시오 : stackoverflow.com/questions/2673121/… . 코드가 주석에 도달하면 객체에 직접적인 속성이 없습니다. 그렇지 않다면 그렇게 될 것입니다.
Daniel Vassallo

2
var hasAnyProps = false; for (var key in obj) { hasAnyProps = true; break; }
// as of this line hasAnyProps will show Boolean whether or not any iterable props exist

단순, 모든 브라우저에서 작동하고, 비록 기술적으로는 않는 개체에 대한 모든 키에 대한 루프의 NOT 그들 모두를 통해 루프를 ... 중 하나가 0이고 루프가 실행되지 않거나 일부가이며 최초의 후 휴식 하나 (우리가 확인하는 모든 것이 있다면 ... 계속 왜 그렇습니까?)


1

답변이 매우 늦었지만 프로토 타입으로 처리 할 수있는 방법입니다.

Array.prototype.Any = function(func) {
    return this.some(func || function(x) { return x });
}

Object.prototype.IsAny = function() {
    return Object.keys(this).Any();
}

0

오브젝트가 사용자 정의 오브젝트인지 확인한 경우 UDO가 비어 있는지 판별하는 가장 쉬운 방법은 다음 코드입니다.

isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};

이 방법은 본질적으로 연역적 인 방법이지만 가장 빠르며 가장 빠릅니다.

a={};
isEmpty(a) >> true

a.b=1
isEmpty(a) >> false 

ps :! 브라우저 정의 객체에서는 사용하지 마십시오.


... 0을 반환; return 1}; 동일할까요?
commonpike

1
@pike no, return! 1; return! 0은 return false와 동일합니다; true를 반환하십시오
Christophe

0

늦은 답변이지만 일부 프레임 워크는 객체를 열거 가능하게 처리합니다. 따라서 bob.js 는 다음과 같이 할 수 있습니다.

var objToTest = {};
var propertyCount = bob.collections.extend(objToTest).count();

0

다음을 사용할 수 있습니다.

더블 뱅 !! 부동산 조회

var a = !![]; // true
var a = !!null; // false

hasOwnProperty 이것은 내가 사용했던 것입니다.

var myObject = {
  name: 'John',
  address: null
};
if (myObject.hasOwnProperty('address')) { // true
  // do something if it exists.
}

그러나 JavaScript는 메소드 이름을 보호하지 않기로 결정했기 때문에 변경 될 수 있습니다.

var myObject = {
  hasOwnProperty: 'I will populate it myself!'
};

myObject의 prop

var myObject = {
  name: 'John',
  address: null,
  developer: false
};
'developer' in myObject; // true, remember it's looking for exists, not value.

유형

if (typeof myObject.name !== 'undefined') {
  // do something
}

그러나 null을 확인하지 않습니다.

이것이 최선의 방법이라고 생각합니다.

운영자

var myObject = {
  name: 'John',
  address: null
};

if('name' in myObject) {
  console.log("Name exists in myObject");
}else{
  console.log("Name does not exist in myObject");
}

결과:

myObject에 이름이 있습니다

다음은 in 연산자에 대해 자세히 설명하는 링크입니다 . 객체 속성이 존재하는지 확인


0

ES6 기능

/**
 * Returns true if an object is empty.
 * @param  {*} obj the object to test
 * @return {boolean} returns true if object is empty, otherwise returns false
 */
const pureObjectIsEmpty = obj => obj && obj.constructor === Object && Object.keys(obj).length === 0

예 :


let obj = "this is an object with String constructor"
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = {}
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = []
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = [{prop:"value"}]
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = {prop:"value"}
console.log(pureObjectIsEmpty(obj)) // empty? false

-1

이건 어때요?

var obj = {},
var isEmpty = !obj;
var hasContent = !!obj

이 답변은 질문에 대한 답변이 아닙니다. OP는 개체에 사용자 정의 속성이 포함되어 있는지 묻고 있습니다. 답변은 개체 자체가 부울 false 값으로 변환되는지 확인합니다.
Jasmonate

... 나중에 제임스가 이미이 옵션을 그의 답변에 포함 시켰다는 것을 깨달았습니다. 미안 해요
Peter Toth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.