빈 JavaScript 객체를 어떻게 테스트합니까?


3106

AJAX 요청 후 때때로 내 응용 프로그램이 다음과 같은 빈 객체를 반환 할 수 있습니다.

var a = {};

그런 경우인지 어떻게 확인할 수 있습니까?


7
JSON.js 스크립트를 사용합니까? 또는 다른 JSON 라이브러리. 그런 다음 JSON.encode () 함수를 사용하여 var를 문자열로 변환 한 다음 테스트 할 수 있습니다.
Thevs

if( Object.entries(a).length > 0){ //do }
Muhammad Shahzad

답변:


5418

ECMA 5+ :

// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object

그러나 이로 인해 불필요한 배열 (반환 값 keys) 이 생성 됩니다.

ECMA 5 이전 :

function isEmpty(obj) {
  for(var prop in obj) {
    if(obj.hasOwnProperty(prop)) {
      return false;
    }
  }

  return JSON.stringify(obj) === JSON.stringify({});
}

jQuery :

jQuery.isEmptyObject({}); // true

lodash :

_.isEmpty({}); // true

밑줄 :

_.isEmpty({}); // true

ek

Hoek.deepEqual({}, {}); // true

ExtJS

Ext.Object.isEmpty({}); // true

AngularJS (버전 1)

angular.equals({}, {}); // true

람다

R.isEmpty({}); // true

22
다음은 jQuery와 밑줄 사이의 성능 테스트입니다. jsperf.com/isempty-vs-isemptyobject/6
Mikhail

20
Object.keys(new Date()).length === 0; 따라서이 답변은 오도 될 수 있습니다.
cjbarth 2016 년

6
일을 엄격히하는 대신,이 사실을 활용할 수도 있습니다 : (new Date()).constructor === Date또는 반대로 ({}).constructor === Object.
존 넬슨

2
angular.equals ({}, {});
Jeremy A. West

11
Object.keys()열거 할 수없는 속성이나 기호는 확인하지 않습니다. 당신은 사용해야 Object.getOwnPropertyNames()하고 Object.getOwnPropertySymbols()대신. 또한 Object.getPrototypeOf()객체의 프로토 타입을 얻는 올바른 방법입니다. obj.constructor쉽게 위조 될 수 있습니다. 예 : function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true.
Jesse

862

이 작업을 수행하는 쉬운 방법은 없습니다. 속성을 명시 적으로 반복해야합니다.

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return true;
}

경우 인 ECMAScript 5 지원이 가능하며, 당신이 사용할 수있는 Object.keys()대신 :

function isEmpty(obj) {
    return Object.keys(obj).length === 0;
}

56
이것은 잘 작동하거나 더 간단하게 작동합니다. function isEmpty (object) {for (var i in object) {return true; } 거짓을 반환; }
Nicholas Kreidberg 23

36
이 함수에서 참과 거짓을 바꾸지 않아야합니까?
namtax

25
@namtax : no-함수의 이름 isEmpty()이이므로 false속성이있는 경우 반환해야 합니다.
Christoph

6
빈 객체는 기본 객체 클래스를 확장하지만 객체 프로토 타입이 수정되면 단순화 된 함수가 실패합니다. Object.prototype.a = 'hi'; var obj = {}; 경고 (obj.a); // "hi"를 출력합니다. isEmpty (obj) // false를 반환합니다.
venimus

29
두 번째 예제는 O (n) 시간 복잡성과 O (n) 공간 복잡성이므로 첫 번째 예제는 O (1)이므로 사용하지 않아야합니다.
Brian

572

동일한 문제가 있지만 jQuery를 사용하는 사용자는 jQuery.isEmptyObject 를 사용할 수 있습니다 .


43
야! 방금 IE 8 문제를 디버깅하는 데 몇 시간을 소비하여 문제의 원인이 jQuery.isEmptyObject임을 알았습니다. 객체가 비어 있으면 true를 반환합니다.
MFD3000

162
질문이 jQuery에 관한 것이 아닌 경우 왜 jQuery를 포함한 답변을 게시합니까?
Eru

47
나는 그 오래된 의견을 알고 있지만, 문서가 @ MFD3000이라는 질문이 궁금하다. 왜냐하면 객체가 비어 있으면 (이름에서 알 수
있듯이

21
그런 기본 작업에 jQuery를 포함시키는 것이 정답이라고 부르는 것이 아닙니다. 요즘 jQuery는 거의 어디에나 존재하지만, 우리는 여전히 매우 유능한 언어 자체를 기반으로 구축 된 것을 잊지 말아야합니다.
Pablo Mescher

54
이 의견에서 일반적인 JS 스노 버. 누구나 웹에서 JavaScript의 많은 부분이 jQuery로 작성되어 있다는 것을 알고 있으므로, jQuery에 이미 객체 테스트를위한 내장 메소드가있는 경우 여기에 솔루션을 제공하는 것이 허용됩니다. 도움을 원하는 수천 명의 개발자가이 답변이 도움이 될 것입니다. 아무도 그것이 그것을 할 수있는 유일한 방법이라고 말하지 않았습니다. 나는 사용하는 솔루션을 게시 한 사람에 대해 아무도 엘리트를 어떻게 행동하지 underscore.js
않는지 알아 차렸다

276

이것이 내가 선호하는 솔루션입니다.

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty


3
@Jero Franzani : 아니, 그렇지 않다
nikoskip

Object.keys ({}). length는 (for ... in ...) 옵션보다 10 배 느립니다. objetc가 비어 있는지 테스트하는 방법으로 피하는 것이 좋습니다.
davidhadas

10
Object.keys(new Date()).length === 0; 따라서이 답변은 오도 될 수 있습니다.
cjbarth 2016 년

new Date()객체가 아닙니다. nd = new Date(); nd.constructor === Object;결과 false.
pors

204

Underscore.js 를 사용할 수 있습니다 .

_.isEmpty({}); // true

19
또는 lodash를 사용할 수 있습니다 ( lodash.com/docs#isEmpty ). 그러나 jQuery 솔루션을 사용하는 것과 다른 점은 무엇 입니까 ? 여전히 추가 라이브러리를 설치해야합니다. 바닐라 자바 ​​스크립트 솔루션이 의도라고 생각합니다.
tfmontague

10
Node.js와 함께 백엔드에서 JS를 사용하려는 경우 다릅니다. 백엔드에서 jQuery (DOM 조작에 주로 사용되는 프론트 엔드 라이브러리)를 사용하려는 사람은 거의 없습니다.
Nahn

3
@tfmontague 밑줄은 jQ가 클라이언트쪽에있는 것처럼 거의 유비쿼터스 인 노드 앱에서 매우 일반적입니다. 난 이미 밑줄이 필요했다하지만이 기능했다 몰랐어요
RW-nandemo

5
밑줄이 lodash로 바뀌고 있습니다. 대신 사용하십시오.
demisx

2
Date 유형에주의하십시오. isEmpty는 Date에 대해 항상 true를 반환합니다. github.com/jashkenas/underscore/issues/445
mentat

116
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

http://bencollier.net/2011/04/javascript-is-an-object-empty/를 참조하십시오


5
걱정할 경우 열거 할 수없는 속성이 포함됩니다.

Object.getOwnPropertyNames ({}). length는 (for ... in ...) 옵션보다 10 배 느립니다. objetc가 비어 있는지 테스트하는 방법으로 피하는 것이 좋습니다.
davidhadas

4
Object.getOwnPropertyNames(new Date()).length === 0; 따라서이 답변은 오도 될 수 있습니다.
cjbarth 2016 년

80

JSON.stringify를 사용하는 것은 어떻습니까? 거의 모든 최신 브라우저에서 사용할 수 있습니다.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}

23
return (JSON.stringify (obj) == '{}')
Vic

26
이런 종류의 유틸리티에는 속도가 느리고 속도가 중요합니다. 여기에서 빠른 성능 테스트 : jsperf.com/empty-object-test

1
이것은 매우 느린 옵션입니다 - 내가 대신 (에 대한 ...) 옵션을를 사용하는 것이 좋습니다
davidhadas

2
그리고 함수를 포함하는 객체에는 작동하지 않습니다.
Felix Kling

1
객체에 순환 참조가 있으면 오류가 발생합니다. 따라서 속도가 느리고 신뢰할 수 없으며 오류를 발생시키고 다른 모든 것을 중단시킬 수 있습니다. 그것을 사용할 이유가 없습니다.
Burak

62

방금 비슷한 상황에 처했습니다. JQuery를 사용하고 싶지 않았으며 순수한 Javascript를 사용 하여이 작업을 원했습니다.

그리고 내가 한 일은 다음 조건을 사용하여 저에게 효과적이었습니다.

var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
   //Code here..
}

같지 않으면 다음을 사용하십시오. JSON.stringify(obj) !== '{}'

JSFiddle을 확인하십시오


4
JSON.stringify에서 순환 참조가있는 객체의 경우 실패합니다. 특히 예외가 발생합니다.
Pedro Montoto García

1
@ PedroMontotoGarcía Ok 그리고 빈 객체는 어떻게 원형 참조를 가지나요?
KthProg

8
객체가 비어 있지 않은 경우 (그리고 그것들도 작동해야 함).
Pedro Montoto García

이것은 @Ateszki에 의해 이미 언급 된 것으로 보이며 객체가 비어 있지 않은지 확인하는 가장 느린 방법 중 하나입니다.
cwadding

아 그래 ..보고 싶었어 나는이 자바 스크립트를 달성하고 싶었던 상황에 빠졌고 약간의 생각 후에 나는이 방법을 알아 냈습니다. @Ateszki, 비록 당신이 한 방식에도 불구하고. :-) Btw, 이것에 대한 많은 답변이 있었으므로 귀하의 답변을 놓쳤습니다.
Anish Nair 2016

60

오래된 질문이지만 문제가 있습니다. 객체가 비어 있지 않은지 확인하는 것이 유일한 목적이라면 JQuery를 포함시키는 것은 좋은 생각이 아닙니다. 대신 JQuery의 코드 깊숙이 들어가면 답을 얻을 수 있습니다.

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}

5
이것은 다른 프로세스가 기본 개체에 프로토 타입을 추가하지 않은 경우에만 유용합니다. 이 진정으로 실행할 수 있도록하려면 obj.hasOwnProperty (이름)에 대한 테스트해야
mpemburn

1
이것은 2009 년부터 Christoph의 답변 에 아무 것도 추가하지 않습니다 .
Dan Dascalescu

39

최신 브라우저를 사용하는 경우 간단한 방법이 있습니다. Object.keys(obj).length == 0


1
keys재산은 어디 에서 왔습니까?

2
그것은 A의 표준 방법 5.1 인 ECMAScript에서
다운로드

1
위의 의견은 어떻게 4 개의 공감대를 가질 수 있습니까? 예, Object.keys표준 방법이지만 객체에는 키 속성이 없습니다. 따라서이 코드는 실수로 0이 아닌 key속성으로 값이 지정된 속성을 갖는 경우를 제외하고는 객체를 비어있는 것으로보고합니다 length. 끔찍 해요!
scravy

Object.keys(new Date()).length === 0; 따라서이 답변은 오도 될 수 있습니다.
cjbarth 2016 년

11
@scravy Object는 Object 클래스입니다. 객체에는 객체를 인수로 받아들이는 'keys'라는 정적 메소드가 있습니다. 이 메소드는 문자열이 특성 이름 인 문자열 배열을 리턴합니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sgnl

34

공연

오늘 2020.01.17 Chrome v79.0, Safari v13.0.4 및 Firefox v72.0의 MacOs HighSierra 10.13.6에서 선택한 솔루션에 대한 테스트를 수행합니다.

결론

  • for-in(A, J, L, M) 기반 솔루션 이 가장 빠름
  • JSON.stringify(B, K) 기반 솔루션 은 느립니다
  • 놀랍게도 Object(N) 기반의 솔루션 은 느립니다.

여기에 이미지 설명을 입력하십시오

세부

아래의 스 니펫에는 15 가지 솔루션이 제시되어 있습니다. 컴퓨터에서 성능 테스트를 실행하려면 여기를 클릭하십시오 .

여기에 이미지 설명을 입력하십시오


당신이 거짓과 진실의 귀환에 모든 것을 기초로하고 있기 때문에 이것의 많은 의미가 없습니다. 때로는 프로그래밍에 if 문이나 삼항 연산자가 필요합니다. 단지 fyi
Christian Matthew

첫 번째 솔루션은 매력처럼 작동합니다.
Carlos Jesus Arancibia Taborga

33

Object.keys (obj) .length (ECMA 5+에 대해 위에서 제안한대로)를 사용하면 빈 객체에 대해 10 배 느려집니다! 올드 스쿨 (for ... in) 옵션을 유지하십시오.

Node, Chrome, Firefox 및 IE 9에서 테스트 한 결과, 대부분의 사용 사례에서 다음과 같이 나타납니다.

  • (for ... in ...)가 사용하는 가장 빠른 옵션입니다!
  • 빈 객체의 경우 Object.keys (obj) .length가 10 배 느리다
  • JSON.stringify (obj) .length는 항상 가장 느립니다 (놀랍지 않음)
  • 일부 시스템에서는 Object.getOwnPropertyNames (obj) .length가 Object.keys (obj) .length보다 훨씬 오래 걸릴 수 있습니다.

결론적으로 현명한 성능을 사용하려면 다음을 사용하십시오.

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

또는

function isEmpty(obj) {
   for (var x in obj) { if (obj.hasOwnProperty(x))  return false; }
   return true;
}

개체가 비어 있습니까? 에서 자세한 테스트 결과 및 테스트 코드를 참조하십시오 .


Object.keys느리지 만 코드는 적습니다. 작은 페이지에서 이것을 10 번 정도 ... 추가 코드의 추가 구문 분석 시간을 고려할 때 여전히 느려 집니까?
yankee


27
  1. 해결 방법입니다. 데이터가없는 경우 서버가 특정 속성을 생성 할 수 있습니까?

    예를 들면 다음과 같습니다.

    var a = {empty:true};

    그런 다음 AJAX 콜백 코드에서 쉽게 확인할 수 있습니다.

  2. 그것을 확인하는 또 다른 방법 :

    if (a.toSource() === "({})")  // then 'a' is empty

편집 : JSON 라이브러리 (fe JSON.js)를 사용하는 경우 JSON.encode () 함수를 시도하고 빈 값 문자열에 대해 결과를 테스트 할 수 있습니다.


6
toSource()비표준이며 IE 또는 Opera에서 작동하지 않습니다 (및 잠재적으로 확인하지 않은 다른 브라우저)
Christoph

4
@Thevs : 아마도 ECMA-262의 현재 버전과는 다른 복사본이 있지만 15.2.4 toSource절에 속성이 나와 있지 않습니다 . MDC에 따르면 JS1.3 (예 : Netscape Navigator 4.06)에 도입되었지만 ECMA-262, 3 판에는 없습니다!
Christoph

4
@Thevs : 글쎄, 적어도 2 개의 중요한 브라우저 공급 업체가 그것을 구현하지 않았기 때문에 사실상 표준이 아니며 ECMA-262에 없기 때문에 실제 버전도 아닙니다 ...
Christoph

4
그것이 작동하는 경우에도 (있는 그대로)이 작업 toSource()을 수행하는 끔찍한 방법 JSON.encode()입니다. 비어 있는지 확인하려면 전체 객체를 나타내는 문자열을 작성해야합니다. 사물을 문자열로 변환하는 오버 헤드가 있지만 객체에 백만 개의 속성이있는 경우 백만 가지를 변환해야하지만 실제로 하나만 보면 비어 있지 않다는 것을 알 수 있습니다.
재스퍼

4
@Thevs 오버 헤드가 더 커도 수 있습니다 크기의 동일한 순서로 (나는 그것이 모든 상황하에 확실하지 않다). 그러나 그 대답은 이야기가 완전히 다른 다른 속성을 발견하자마자 거짓을 돌려주는 것과 관련이 있습니다.
Jasper

25

객체가 비어 있는지 확인하는 완전한 기능을 만들었습니다.

그것은 사용 Object.keys에서 ECMAScript를 5 (참조 최상의 성능을 달성하기 위해 (ES5) 기능이 가능하다면 호환성 테이블 구형 엔진 (브라우저)에 가장 호환 접근 방식) 및 폴백을.

해결책

/**
 * Returns true if specified object has no properties,
 * false otherwise.
 *
 * @param {object} object
 * @returns {boolean}
 */
function isObjectEmpty(object)
{
    if ('object' !== typeof object) {
        throw new Error('Object must be specified.');
    }

    if (null === object) {
        return true;
    }

    if ('undefined' !== Object.keys) {
        // Using ECMAScript 5 feature.
        return (0 === Object.keys(object).length);
    } else {
        // Using legacy compatibility mode.
        for (var key in object) {
            if (object.hasOwnProperty(key)) {
                return false;
            }
        }
        return true;
    }
}

여기 요지가 있습니다이 코드 는 .

그리고 여기 JSFiddle이 있습니다 에 데모와 간단한 테스트 이 있습니다.

누군가에게 도움이되기를 바랍니다. 건배!


3
이것은 null객체에 실패 합니다.

안녕하세요 @ 토라 자부로! 통지 해 주셔서 감사합니다! 올바른 구현으로 모든 소스를 업데이트했습니다.
Slava Fomin II

1
Object.keys ({}). length는 (for ... in ...) 옵션보다 10 배 느립니다. objetc가 비어 있는지 테스트하는 방법으로 피하는 것이 좋습니다.
davidhadas

1
Object.keys(new Date()).length === 0; 따라서이 답변은 오도 될 수 있습니다.
cjbarth 2016 년

19

나는 이것을 사용하고 있습니다.

function isObjectEmpty(object) {
  var isEmpty = true;
  for (keys in object) {
     isEmpty = false;
     break; // exiting since we found that the object is not empty
  }
  return isEmpty;
}

예 :

var myObject = {}; // Object is empty
var isEmpty  = isObjectEmpty(myObject); // will return true;

// populating the object
myObject = {"name":"John Smith","Address":"Kochi, Kerala"}; 

// check if the object is empty
isEmpty  = isObjectEmpty(myObject); // will return false;

여기에서

최신 정보

또는

isEmptyObject의 jQuery 구현을 사용할 수 있습니다.

function isEmptyObject(obj) {
  var name;
  for (name in obj) {
    return false;
  }
  return true;
}

안녕. 숫자 또는 부울 true 또는 false를 사용하여이 함수를 테스트 할 때 true를 리턴하면 올바른 결과가 아닙니다. isObjectEmpty (true)입니다. isObjectEmpty (false)입니다. isObjectEmpty (1)
iman

2
데이터 유형이 객체가 아닌 객체가 비어 있는지 확인하고 있습니다. 당신의 경우 객체인지 확인하기 위해 if (typeof a === "object") {...}
kiranvj

15

다음 예제는 JavaScript 객체가 비어 있는지 테스트하는 방법을 보여줍니다. 비어 있으면 비어있는 속성이 없습니다.

이 스크립트는 ES6에서 작동합니다.

const isEmpty = (obj) => {
    if (obj === null ||
        obj === undefined ||
        Array.isArray(obj) ||
        typeof obj !== 'object'
    ) {
        return true;
    }
    return Object.getOwnPropertyNames(obj).length === 0;
};
console.clear();
console.log('-----');
console.log(isEmpty(''));           // true
console.log(isEmpty(33));           // true
console.log(isEmpty([]));           // true
console.log(isEmpty({}));           // true
console.log(isEmpty({ length: 0, custom_property: [] })); // false
console.log('-----');
console.log(isEmpty('Hello'));      // true
console.log(isEmpty([1, 2, 3]));    // true
console.log(isEmpty({ test: 1 }));  // false
console.log(isEmpty({ length: 3, custom_property: [1, 2, 3] })); // false
console.log('-----');
console.log(isEmpty(new Date()));   // true
console.log(isEmpty(Infinity));     // true
console.log(isEmpty(null));         // true
console.log(isEmpty(undefined));    // true


15

Object.entries () 에 대한 ES2017 사양에 따라 최신 브라우저를 사용하면 간단하게 확인할 수 있습니다.

Object.entries({}).length === 0

3
이 이상 사용하여 어떤 혜택이 있습니까 Object.keys또는 Object.values?
faintsignal

@faintsignal을 사용하면 완벽하게 괜찮습니다. 의견에서 찾지 못한 항목을 방금 추가했습니다.
Vikrant

13
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}

4
예를 들어 JavaScript 라이브러리 Object가 프로토 타입 체인을 통해 메소드로 확장되는 경우에도 마찬가지입니다. 열거 가능하고 for in명령문이 열거 가능한 특성을 통해 반복 되기 때문입니다 .
viam0Zah 2009


12

적어도 하나의 키가 있는지 확인하려고합니다. 비어 있지 않다고 말하면 충분합니다.

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])

1
첫 번째 키가 false값을 반환 하면 어떻게됩니까? 결과 false가 잘못되었습니다.
Jimmy Obonyo Abor

나는 그것을 테스트했다. 실제 사례를 제시 할 수 있습니까?
Tudor Morar

1
이것은 짧고 간결하지만 객체가 정의되어 있지 않으면 런타임 오류가 발생합니다
Mrinmoy

11

후드 아래에서 모든 라이브러리의 모든 빈 검사 방법은 개체 키 검사 논리를 사용합니다. 이해하기 쉬운 방법으로, 여기 에 설명 된 방법을 넣을 수 있습니다 .

for(key in obj){
   //your work here.
 break;
}

ES5 에서 발전한 것은 이제 Object.Keys객체를 매개 변수로 취하는 방법을 사용하여 객체의 키 길이를 간단히 확인할 수 있습니다 .

if(Object.keys(obj).length > 0){
 //do your work here
}

또는 Lodash 를 사용하는 경우 ( 그렇습니다 ).

 _.isEmpty(obj) //==true or false

if 문을 작성하는 이상한 방법으로는 정확하지만 나중에 코드를 유지 관리하는 사람을 혼동시킬 수 있습니다.
Soren

10


jQuery 또는 다른 라이브러리를 사용하지 않은이 간단한 코드를 사용할 수 있습니다

var a=({});

//check is an empty object
if(JSON.stringify(a)=='{}') {
    alert('it is empty');
} else {
    alert('it is not empty');
}

JSON 클래스와 그 기능 ( 구문 분석stringify )은 매우 유용하지만 IE7 에는 약간의 문제가 있어이 간단한 코드 http://www.json.org/js.html로 해결할 수 있습니다 .

다른 간단한 방법 (가장 간단한 방법) : jQuery 또는 JSON 객체를
사용하지 않고도이 방법을 사용할 수 있습니다 .

var a=({});

function isEmptyObject(obj) {
    if(typeof obj!='object') {
        //it is not object, so is not empty
        return false;
    } else {
        var x,i=0;
        for(x in obj) {
            i++;
        }
        if(i>0) {
            //this object has some properties or methods
            return false;
        } else {
            //this object has not any property or method
            return true;
        }
    }
}

alert(isEmptyObject(a));    //true is alerted

JSON.stringify객체에 함수 나 "정의되지 않은"과 같은 문자열화할 수없는 속성이 포함 된 경우 솔루션이 실패하지만, 이는 예외적 인 경우입니다.

10

내가 찾은 가장 좋은 방법 :

function isEmpty(obj)
{
    if (!obj)
    {
        return true;
    }

    if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
    {
        return true;
    }

    return false;
}

작동합니다 :

    t1: {} -> true
    t2: {0:1} -: false
    t3: [] -> true
    t4: [2] -> false
    t5: null -> true
    t6: undefined -> true
    t7: "" -> true
    t8: "a" -> false
    t9: 0 -> true
    t10: 1 -> false

3
실제로 0이므로 0은 비어 있지 않습니다. 다른 모든 것은 좋아 보이지만 수정은 쉽습니다. 첫 번째 if 문에서 이것을 추가하십시오. if (!obj && obj !== 0).
mjwrazor 2016 년

9

나의 테이크 :

function isEmpty(obj) {
    return !Object.keys(obj).length > 0;
}

var a = {a:1, b:2}
var b = {}

console.log(isEmpty(a)); // false
console.log(isEmpty(b)); // true

모든 브라우저가 Object.keys()현재 구현되지는 않는다고 생각합니다 .


2
Object.keys(new Date()).length === 0; 따라서이 답변은 오도 될 수 있습니다.
cjbarth 2016 년

3
키를 노출시키지 않아도 날짜가 항상 "전체"인 것으로 간주하는지 여부에 따라 다릅니다. 그러나 그것이 당신의 계획이라면, Date 생성자를 점검하는 보충 인스턴스를 추가하는 것이 좋은 옵션이라는 데 동의합니다.
NiKo


7

경고! JSON의 제한을주의하십시오.

javascript:
  obj={  f:function(){}  };
  alert( "Beware!! obj is NOT empty!\n\nobj = {  f:function(){}  }" + 
               "\n\nJSON.stringify( obj )\n\nreturns\n\n" +
                        JSON.stringify( obj ) );

표시

    조심해 !! obj가 비어 있지 않습니다!

    obj = {f : function () {}}

    JSON.stringify (obj)

    보고

    {}

7

정답은 다음과 같습니다.

const isEmptyObject = obj =>
  Object.getOwnPropertyNames(obj).length === 0 &&
  Object.getOwnPropertySymbols(obj).length === 0 &&
  Object.getPrototypeOf(obj) === Object.prototype;

이것은 다음을 확인합니다.

  • 이 개체에는 열거 형에 관계없이 고유 한 속성이 없습니다.
  • 개체에는 고유 한 속성 기호가 없습니다.
  • 객체의 프로토 타입은 정확히 Object.prototype입니다.

다시 말해 객체는로 만든 객체와 구별 할 수 없습니다 {}.


6

Thevs 답변 외에도 :

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

jquery + jquery.json입니다.


원형 객체 구조로는 작동하지 않기 때문에 JSON을 사용하는 것을 좋아하지 않습니다.
itdoesntwork

2
페이지에 jQuery가로드 된 경우를 사용 $.isEmptyObject()하면 명확하지 않은 변환으로 사이클을 낭비하지 마십시오.
skierpage

6

Sugar.JS 는이를 위해 확장 된 개체를 제공합니다. 코드는 깨끗하고 간단합니다.

확장 된 객체를 만듭니다.

a = Object.extended({})

크기를 확인하십시오.

a.size()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.