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

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

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

其他回答

funtion isEmpty(o,i)
{
    for(i in o)
    {
        return!1
    }
    return!0
}

对于ECMAScript5(不是所有浏览器都支持),你可以使用:

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

优雅的方式——使用钥匙

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

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

我修改了肖恩·维埃拉的代码来满足我的需要。Null和undefined根本不算作对象,数字、布尔值和空字符串返回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;