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

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

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

    return i;
}

当前回答

让我们把这个孩子放在床上;在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);

其他回答

让我们把这个孩子放在床上;在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);

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

不需要图书馆。

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

优雅的方式——使用钥匙

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

你可以写一个回退数组。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;
}