对象是空的吗?

什么是检查对象是否为空的最快方法?

有没有比这更快,更好的方法:

function count_obj(obj){ var i = 0; for(var key in obj){ ++i; } return i; } 

我假设你的意思是“没有属性”。

 // Speed up calls to hasOwnProperty var hasOwnProperty = Object.prototype.hasOwnProperty; function isEmpty(obj) { // null and undefined are "empty" if (obj == null) return true; // Assume if it has a length property with a non-zero value // that that property is correct. if (obj.length > 0) return false; if (obj.length === 0) return true; // If it isn't an object at this point // it is empty, but it can't be anything *but* empty // Is it empty? Depends on your application. if (typeof obj !== "object") return true; // Otherwise, does it have any properties of its own? // Note that this doesn't handle // toString and valueOf enumeration bugs in IE < 9 for (var key in obj) { if (hasOwnProperty.call(obj, key)) return false; } return true; } 

例子:

 isEmpty(""), // true isEmpty(33), // true (arguably could be a TypeError) isEmpty([]), // true isEmpty({}), // true isEmpty({length: 0, custom_property: []}), // true isEmpty("Hello"), // false isEmpty([1,2,3]), // false isEmpty({test: 1}), // false isEmpty({length: 3, custom_property: [1,2,3]}) // false 

如果您只需要处理ECMAScript5浏览器 ,则可以使用Object.getOwnPropertyNames而不是hasOwnProperty循环:

 if (Object.getOwnPropertyNames(obj).length > 0) return false; 

这将确保即使对象只有非枚举属性isEmpty仍然会给你正确的结果。

对于ECMAScript5(尽pipe在所有浏览器中都不支持),您可以使用:

 Object.keys(obj).length === 0 

简单和跨浏览器的方式是通过使用jQuery.isEmptyObject

 if ($.isEmptyObject(obj)) { // do something } 

更多: http : //api.jquery.com/jQuery.isEmptyObject/

你需要jquery。

下划线的isEmpty()方便,如果你不介意添加一个额外的库。

 _.isEmpty({}); 

让我们把这个婴儿放在床上; 在Node,Chrome,Firefox和IE 9下进行了testing,对于大多数使用情况显而易见:

  • (for … in …)是最快的select!
  • Object.keys(obj).length是空对象慢10倍
  • JSON.stringify(obj).length总是最慢 (不奇怪)
  • Object.getOwnPropertyNames(obj).length比Object.keys(obj)需要更长的时间。在某些系统上.length可能会更长。

底线performance明智,使用:

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

节点下的结果:

  • 第一个结果: return (Object.keys(obj).length === 0)
  • 第二个结果: for (var x in obj) { return false; }... for (var x in obj) { return false; }...
  • 第三个结果: for (var x in obj) { if (obj.hasOwnProperty(x)) return false; }... for (var x in obj) { if (obj.hasOwnProperty(x)) return false; }...
  • return ('{}' === JSON.stringify(obj))结果: return ('{}' === JSON.stringify(obj))

用0键testing对象0.00018 0.000015 0.000015 0.000324

用1个键testing物体0.000346 0.000458 0.000577 0.000657

使用2个键testing对象0.000375 0.00046 0.000565 0.000773

使用3个键testing对象0.000406 0.000476 0.000577 0.000904

用4个键testing对象0.000435 0.000487 0.000589 0.001031

用5个键testing对象0.000465 0.000501 0.000604 0.001148

用6个键testing对象0.000492 0.000511 0.000618 0.001269

用7个键testing对象0.000528 0.000527 0.000637 0.00138

用8个键testing对象0.000565 0.000538 0.000647 0.00159

用100个键testing对象0.003718 0.00243 0.002535 0.01381

用1000个键testing对象0.0337 0.0193 0.0194 0.1337

请注意,如果您的典型用例使用less量键testing非空对象,并且很less使用10个或更多键testing空对象或对象,请考虑Object.keys(obj).length选项。 – 否则与更通用的(for … in …)实现。

请注意,Firefox似乎对Object.keys(obj).length和Object.getOwnPropertyNames(obj).length有更快的支持,使它成为任何非空对象的更好select,但仍然当涉及空对象时,(对…而言)仅仅快了10倍。

我的2美分是Object.keys(obj).length是一个不好的主意,因为它创build一个键的对象只是计算内部有多less个键,而不是破坏它! 为了创build这个对象,他需要循环显示键…为什么使用它而不是(for … in …)选项:)

 var a = {}; function timeit(func,count) { if (!count) count = 100000; var start = Date.now(); for (i=0;i<count;i++) func(); var end = Date.now(); var duration = end - start; console.log(duration/count) } function isEmpty1() { return (Object.keys(a).length === 0) } function isEmpty2() { for (x in a) { return false; } return true; } function isEmpty3() { for (x in a) { if (a.hasOwnProperty(x)) return false; } return true; } function isEmpty4() { return ('{}' === JSON.stringify(a)) } for (var j=0;j<10;j++) { a = {} for (var i=0;i<j;i++) a[i] = i; console.log('Testing for Object with '+Object.keys(a).length+' keys') timeit(isEmpty1); timeit(isEmpty2); timeit(isEmpty3); timeit(isEmpty4); } a = {} for (var i=0;i<100;i++) a[i] = i; console.log('Testing for Object with '+Object.keys(a).length+' keys') timeit(isEmpty1); timeit(isEmpty2); timeit(isEmpty3); timeit(isEmpty4, 10000); a = {} for (var i=0;i<1000;i++) a[i] = i; console.log('Testing for Object with '+Object.keys(a).length+' keys') timeit(isEmpty1,10000); timeit(isEmpty2,10000); timeit(isEmpty3,10000); timeit(isEmpty4,10000); 
 function isEmpty( o ) { for ( var p in o ) { if ( o.hasOwnProperty( p ) ) { return false; } } return true; } 

优雅的方式 – 使用钥匙

 var myEmptyObj = {}; var myFullObj = {"key":"value"}; console.log(Object.keys(myEmptyObj).length); //0 console.log(Object.keys(myFullObj).length); //1 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

感到惊讶的是,在这样一个基本的JS问题上看到这么多弱的答案…最佳答案也不好,因为这些原因:

  1. 它会生成一个全局variables
  2. undefined返回true
  3. for...in本身非常缓慢
  4. 函数里面for...in是没用的 – 没有hasOwnProperty情况下返回false就会正常工作

事实上有一个更简单的解决scheme:

 function isEmpty(value){ return Boolean(value && typeof value == 'object') && !Object.keys(value).length; }); 

https://lodash.com/docs#isEmpty非常方便:;

 _.isEmpty({}) // true _.isEmpty() // true _.isEmpty(null) // true _.isEmpty("") // true 

这有多糟糕?

 function(obj){ for(var key in obj){ return false; // not empty } return true; // empty } 

您可以使用JSON.stringify(obj)然后将其与空对象进行比较。 喜欢这个:

 JSON.stringify(your_object)=="{}" 

不需要图书馆。

 function(){ //must be within a function var obj = {}; //the object to test for(var isNotEmpty in obj) //will loop through once if there is a property of some sort, then return alert('not empty')//what ever you are trying to do once return alert('empty'); //nope obj was empty do this instead; } 

这里是一个简单的函数,用于testingtodomvc src代码中的对象是否为空(用于约束违规检查)。

 var _isEmptyObject = function (obj) { for (var property in obj) return false; return true; }; 

这里是一个angular度的例子:

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

还有一个来自离子:

 function isObjectEmpty(obj) { if (obj) { for (var prop in obj) { return false; } } return true; } 

这可能有点哈克。 你可以试试这个

 if (JSON.stringify(data).length === 2) { // Do something } 

不确定这种方法是否有缺点

快速onliner'字典'对象:

 function isEmptyDict(d){for (var k in d) return false; return true} 

如果Array.isArray和Object.getOwnPropertyNames不可用,则可以编写回退

 XX.isEmpty = function(a){ if(Array.isArray(a)){ return (a.length==0); } if(!a){ return true; } if(a instanceof Object){ if(a instanceof Date){ return false; } if(Object.getOwnPropertyNames(a).length == 0){ return true; } } return false; } 

想象一下你有下面的对象:

 var obj1= {}; var obj2= {test: "test"}; 

不要忘了我们不能用===符号来testing一个对象是否平等,因为它们是inheritance的,所以如果你使用ECMA 5和JavaScript的高版本,答案很简单,你可以使用下面的函数:

 function isEmpty(obj) { //check if it's an Obj first var isObj = obj !== null && typeof obj === 'object' && Object.prototype.toString.call(obj) === '[object Object]'; if (isObj) { for (var o in obj) { if (obj.hasOwnProperty(o)) { return false; break; } } return true; } else { console.error("isEmpty function only accept an Object"); } } 

所以结果如下:

 isEmpty(obj1); //this returns true isEmpty(obj2); //this returns false isEmpty([]); // log in console: isEmpty function only accept an Object 
 var x= {} var y= {x:'hi'} console.log(Object.keys(x).length==0) console.log(Object.keys(y).length==0) true false 

http://jsfiddle.net/j7ona6hz/1/

 if (Object.getOwnPropertyNames(obj1).length > 0) { alert('obj1 is empty!'); } 

我玩了一下,得到了这个:

 jQuery.isBlank = function (obj) { if (!obj || jQuery.trim(obj) === "") return true; if (obj.length && obj.length > 0) return false; for (var prop in obj) return false; return true; }; console.log( $.isBlank(0), // true $.isBlank(""), // true $.isBlank(null), // true $.isBlank(false), // true $.isBlank(undefined), // true $.isBlank([]), // true $.isBlank([null]), // true $.isBlank([undefined]), // true $.isBlank({}), // true $.isBlank({foo: 0}), // false $.isBlank({foo: null}), // false $.isBlank({foo: false}), // false $.isBlank({foo: undefined}), // false $.isBlank("Hello"), // false $.isBlank([1,2,3]), // false $.isBlank({foo: 1}), // false $.isBlank({foo: 3, bar: [1,2,3]}), // false "incorrect:", $.isBlank(1), // true $.isBlank(true), // true $.isBlank([0]), // false $.isBlank([false]), // false $.isBlank("0"), // false $.isBlank(["0"]), // false $.isBlank({foo: "0"}) // false ); 

从这里得到灵感: https : //gist.github.com/laktek/758269#comment-784188

这是一个很好的方法来做到这一点

 function isEmpty(obj) { if (Array.isArray(obj)) { return obj.length === 0; } else if (typeof obj === 'object') { for (var i in obj) { return false; } return true; } else { return !obj; } } 
 var hasOwnProperty = Object.prototype.hasOwnProperty; function isArray(a) { return Object.prototype.toString.call(a) === '[object Array]' } function isObject(a) { return Object.prototype.toString.call(a) === '[object Object]' } function isEmpty(a) { if (null == a || "" == a)return!0; if ("number" == typeof a || "string" == typeof a)return!1; var b = !0; if (isArray(a)) { if (!a.length)return!0; for (var c = 0; c < a.length; c++)isEmpty(a[c]) || (b = !1); return b } if (isObject(a)) { for (var d in a)hasOwnProperty.call(a, d) && (isEmpty(a[d]) || (b = !1)); return b } return!0 } 

也许你可以用这个决定:

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

我修改了肖恩·维埃拉的代码以适应我的需求。 null和undefined根本不算作对象,数字,布尔值和空string返回false。

 'use strict'; // Speed up calls to hasOwnProperty var hasOwnProperty = Object.prototype.hasOwnProperty; var isObjectEmpty = function(obj) { // null and undefined are not empty if (obj == null) return false; if(obj === false) return false; if(obj === true) return false; if(obj === "") return false; if(typeof obj === "number") { return false; } // Assume if it has a length property with a non-zero value // that that property is correct. if (obj.length > 0) return false; if (obj.length === 0) return true; // Otherwise, does it have any properties of its own? // Note that this doesn't handle // toString and valueOf enumeration bugs in IE < 9 for (var key in obj) { if (hasOwnProperty.call(obj, key)) return false; } return true; }; exports.isObjectEmpty = isObjectEmpty; 

一个对象是一个关联数组,增加了一个原型。

Object.is()方法确定两个值是否是相同的值。

对象的比较:

 Object.is('LOL', 'LOL');// true Object.is(console, console);// true Object.is(null, null);// true Object.is('ROFL', 'LOL');// false Object.is([], []);// false Object.is(0, -0);// false Object.is(NaN, 0/0);// true if (!Object.is) { // do something } 
 funtion isEmpty(o,i) { for(i in o) { return!1 } return!0 } 

这里我的解决scheme

 function isEmpty(value) { if(Object.prototype.toString.call(value) === '[object Array]') { return value.length == 0; } else if(value != null && typeof value === 'object') { return Object.getOwnPropertyNames(value).length == 0; } else { return !(value || (value === 0)); } } 

CHEARS