빈 JavaScript 객체를 어떻게 테스트합니까?
질문
AJAX 요청 후에는 때로는 응용 프로그램이 빈 객체를 반환 할 수 있습니다.
var a = {};
그 사건이 있는지 어떻게 확인할 수 있습니까?
답변
ECMA 5+ :
// because Object.keys(new Date()).length === 0;
// we have to do some additional check
obj // 👈 null and undefined check
&& Object.keys(obj).length === 0
&& Object.getPrototypeOf(obj) === Object.prototype
그러나 이것이 불필요한 배열 (키의 반환 값)이 생성됩니다.
사전 ECMA 5 :
function isEmpty(obj) {
for(var prop in obj) {
if(Object.prototype.hasOwnProperty.call(obj, prop)) {
return false;
}
}
return JSON.stringify(obj) === JSON.stringify({});
}
jQuery :
jQuery.isEmptyObject({}); // true
Lodash :
_.isEmpty({}); // true
밑줄:
_.isEmpty({}); // true
호크
Hoek.deepEqual({}, {}); // true
extjs.
Ext.Object.isEmpty({}); // true
Angularjs (버전 1)
angular.equals({}, {}); // true
람다
R.isEmpty({}); // true
답변
ECMAScript 5 지원을 사용할 수있는 경우 object.keys ()를 사용할 수 있습니다.
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
ES3 이상을 위해서는 쉽게 할 수있는 방법이 없습니다.명시 적으로 속성을 반복해야합니다.
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
답변
동일한 문제가 있지만 jQuery를 사용하는 사용자를 위해 jQuery.isemptyObject를 사용할 수 있습니다.
답변
성능
오늘날 2020.01.17, 나는 Chrome V79.0, Safari v13.0.4 및 Firefox v72.0의 MacOS 높은 시에라 10.1.6에 대한 테스트를 수행했습니다.선택한 솔루션의 경우.
결론
인내 (a, j, l, m)를 기반으로하는 솔루션은 가장 빠릅니다. JSON.Stringify (B, K)를 기반으로하는 솔루션은 느리게됩니다. 놀랍게도, 물체 (n)에 기초한 솔루션도 느리다.

세부
아래 스 니펫에는 15 개의 솔루션이 제시되어 있습니다. 컴퓨터에서 성능 테스트를 실행하려면 여기를 클릭하십시오. 이 링크는 2021.07.08 업데이트되었지만 원래 테스트는 여기에서 수행되었으며 위의 표가 거기에서 나왔습니다 (그러나 이제는 더 이상 작동하지 않음).
var log = (s, f) => console.log ({$ {s} -> {} : $ {f ({})} {k : 2} : $ {f ({k : 2})} `); 기능 a (obj) { (var i in obj)는 false를 반환합니다. 진실한 반환; } 기능 B (obj) { json.stringify (obj) === "{}"; } 기능 C (obj) { object.keys (obj) .length == 0; } 기능 D (obj) { return object.entries (obj) .length === 0; } 기능 e (obj) { object.getOwnPropertyNames (obj) .length === 0; } 기능 f (obj) { object.keys (obj) .length === 0 && obj.constructor === 객체; } 기능 g (obj) { obj === "undefined"|| ! Boolean (Object.Keys (OBJ) [0]); } 함수 h (obj) { object.entries (obj) .length === 0 && obj.constructor === 객체; } 기능 I (OBJ) { return object.values (obj) .eevery ((val) => typeof val === "undefined"); } 기능 j (obj) { for (obj의 const 키) { if (hasownproperty.call (obj, key)) { 거짓 반환; } } 진실한 반환; } 기능 K (obj) { for (obj의 var prop) { if (obj.hasownproperty (prop)) { 거짓 반환; } } JSON.Stringify (obj) === JSON.Stringify ({}); } 함수 l (obj) { for (obj의 var prop) { if (obj.hasownproperty (prop))는 false를 반환합니다. } 진실한 반환; } 기능 m (obj) { for (obj in var k) { if (obj.hasownproperty (k)) { 거짓 반환; } } 진실한 반환; } 함수 n (obj) { 반품 ( object.geTownPropertyNames (obj) .length === 0 && object.getOwnPropertySymbols (obj) .length === 0 && object.getPrototypeOf (obj) === object.protype. ); } 기능 O (obj) { 반환! (Object.GeToWnPropertyNames! == 정의되지 않은) ~을 자란 object.getownPropertyNames (obj) .length! == 0. : (함수 () { for (obj의 var 키) 휴식; 리턴 키! == null && 키! == 정의되지 않은; }) ()); } 로그 ( "a", a); 로그 ( "B", B); 로그 ( "C", C); 로그 ( "D", D); 로그 ( "e", e); 로그 ( "F", F); 로그 ( "G", G); 로그 ( "H", H); 로그 ( "i", i); 로그 ( "J", J); 로그 ( "K", K); 로그 ( "L", L); 로그 ( "m", m); 로그 ( "n", n); 로그 ( "O", O);

답변
underscore.js를 사용할 수 있습니다.
_.isEmpty({}); // true
답변
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
http://bencollier.net/2011/04/javascript-an- object-objecty/
출처:https://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object
최근댓글