检查对象是否为空的最快方法是什么?
有没有比这更快更好的方法:
function count_obj(obj){
var i = 0;
for(var key in obj){
++i;
}
return i;
}
检查对象是否为空的最快方法是什么?
有没有比这更快更好的方法:
function count_obj(obj){
var i = 0;
for(var key in obj){
++i;
}
return i;
}
当前回答
编辑:请注意,您可能应该使用ES5解决方案而不是这个,因为ES5支持现在已经广泛使用。但它仍然适用于jQuery。
简单和跨浏览器的方法是使用jQuery.isEmptyObject:
if ($.isEmptyObject(obj))
{
// do something
}
更多:http://api.jquery.com/jQuery.isEmptyObject/
但是你需要jquery。
其他回答
这可能有点俗气。你可以试试这个。
if (JSON.stringify(data).length === 2) {
// Do something
}
不确定这种方法是否有任何缺点。
情况有多糟?
function(obj){
for(var key in obj){
return false; // not empty
}
return true; // empty
}
你可以写一个回退数组。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 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
让我们把这个孩子放在床上;在Node, Chrome, Firefox和ie9下测试,很明显,对于大多数用例:
(for…in…)是最快的选择! 种(obj)。对于空对象,长度要慢10倍 JSON.stringify (obj)。长度总是最慢的(这并不奇怪) Object.getOwnPropertyNames (obj)。length比Object.keys(obj)要长。在某些系统上,长度可能更长。
底线性能方面,使用:
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;
}
Node下的结果:
第一个结果:返回(Object.keys(obj)。长度=== 0) 第二个结果:for (var x in obj){返回false;}…… 第三个结果:for (var x in obj) {if (obj. hasownproperty (x))返回false;}…… return ('{}' === JSON.stringify(obj))
测试0键的对象 0.00018 0.000015 0.000015 0.000324
测试带有1个键的对象 0.000346 0.000458 0.000577 0.000657
测试带有2个键的对象 0.000375 0.00046 0.000565 0.000773
测试带有3个键的对象 0.000406 0.000476 0.000577 0.000904
测试带有4个键的对象 0.000435 0.000487 0.000589 0.001031
测试5个键的对象 0.000465 0.000501 0.000604 0.001148
测试有6个键的对象 0.000492 0.000511 0.000618 0.001269
测试带有7个键的对象 0.000528 0.000527 0.000637 0.00138
测试带有8个键的对象 0.000565 0.000538 0.000647 0.00159
测试带有100个键的对象 0.003718 0.00243 0.002535 0.01381
测试具有1000个键的对象 0.0337 0.0193 0.0194 0.1337
请注意,如果您的典型用例测试一个具有很少键的非空对象,并且很少测试空对象或具有10个或更多键的对象,请考虑object .keys(obj)。长度的选择。-否则就用更通用的(for…)在…)的实现。
注意,Firefox似乎对Object.keys(obj)有更快的支持。length和Object.getOwnPropertyNames(obj)。长度,使它成为任何非空对象的更好选择,但当涉及到空对象时,(for…in…)只是快10倍。
我认为Object.keys(obj)。长度是一个糟糕的想法,因为它创建一个键的对象只是为了计算里面有多少个键,而不是破坏它!为了创建该对象,他需要循环显式键…那么为什么用it而不用the (for…)在…)选项:)
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);