cla*_*rkk 482 javascript
检查对象是否为空的最快方法是什么?
有没有比这更快更好的方法:
function count_obj(obj){
var i = 0;
for(var key in obj){
++i;
}
return i;
}
Run Code Online (Sandbox Code Playgroud)
Jak*_*kob 586
对于ECMAScript5(尽管在所有浏览器中都不支持),您可以使用:
Object.keys(obj).length === 0
Run Code Online (Sandbox Code Playgroud)
Sea*_*ira 440
我假设由空你的意思是"没有自己的属性".
// 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;
}
Run Code Online (Sandbox Code Playgroud)
例子:
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
Run Code Online (Sandbox Code Playgroud)
如果您只需要处理ECMAScript5浏览器,则可以使用Object.getOwnPropertyNames而不是hasOwnProperty循环:
if (Object.getOwnPropertyNames(obj).length > 0) return false;
Run Code Online (Sandbox Code Playgroud)
这将确保即使对象仅具有非可枚举属性,isEmpty仍将为您提供正确的结果.
joh*_*odo 219
编辑:请注意,您应该使用ES5解决方案而不是这个,因为ES5支持目前很普遍.它仍适用于jQuery.
简单和跨浏览器的方式是使用jQuery.isEmptyObject:
if ($.isEmptyObject(obj))
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
更多:http://api.jquery.com/jQuery.isEmptyObject/
你需要jquery.
Bra*_*och 95
如果你不介意添加额外的库,下划线和lodash每个都有一个方便的isEmpty()功能.
_.isEmpty({});
Run Code Online (Sandbox Code Playgroud)
dav*_*das 62
让这个宝宝上床睡觉; 在Node,Chrome,Firefox和IE 9下测试,很明显,对于大多数用例:
明智的底线表现,使用:
function isEmpty(obj) {
for (var x in obj) { return false; }
return true;
}
Run Code Online (Sandbox Code Playgroud)
要么
function isEmpty(obj) {
for (var x in obj) { if (obj.hasOwnProperty(x)) return false; }
return true;
}
Run Code Online (Sandbox Code Playgroud)
节点下的结果:
return (Object.keys(obj).length === 0)for (var x in obj) { return false; }...for (var x in obj) { if (obj.hasOwnProperty(x)) return 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).length选项. - 否则请使用更通用的(for ... in ...)实现.
请注意,Firefox似乎更快地支持Object.keys(obj).length和Object.getOwnPropertyNames(obj).length,使其成为任何非空对象的更好选择,但是当涉及空对象时,( for ... in ...)只是快了10倍.
我的2美分是Object.keys(obj).length是一个糟糕的主意,因为它创建一个键对象来计算内部有多少键,而不是销毁它!为了创建该对象,他需要循环键...所以为什么要使用它而不是(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);Run Code Online (Sandbox Code Playgroud)
小智 30
优雅的方式 - 使用键
var myEmptyObj = {};
var myFullObj = {"key":"value"};
console.log(Object.keys(myEmptyObj).length); //0
console.log(Object.keys(myFullObj).length); //1
Run Code Online (Sandbox Code Playgroud)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Šim*_*das 22
function isEmpty( o ) {
for ( var p in o ) {
if ( o.hasOwnProperty( p ) ) { return false; }
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
Too*_*kit 17
var x= {}
var y= {x:'hi'}
console.log(Object.keys(x).length===0)
console.log(Object.keys(y).length===0)
true
false
Run Code Online (Sandbox Code Playgroud)
http://jsfiddle.net/j7ona6hz/1/
meg*_*otz 15
很惊讶在这样一个基本的JS问题上看到这么多弱的答案......由于这些原因,最佳答案也不好:
true上undefinedfor...in本身非常慢for...in是没用的 - false没有hasOwnProperty魔法的返回会很好事实上,有一个更简单的解决方案:
function isEmpty(value){
return Boolean(value && typeof value == 'object') && !Object.keys(value).length;
});
Run Code Online (Sandbox Code Playgroud)
Paw*_*lik 11
https://lodash.com/docs#isEmpty非常方便:
_.isEmpty({}) // true
_.isEmpty() // true
_.isEmpty(null) // true
_.isEmpty("") // true
Run Code Online (Sandbox Code Playgroud)
这有多糟糕?
function(obj){
for(var key in obj){
return false; // not empty
}
return true; // empty
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
643297 次 |
| 最近记录: |