Javascript 对象是空的吗?
检查对象是否为空的最快方法是什么 有没有比这更快更好的方法:Javascript 对象是空的吗?,javascript,Javascript,检查对象是否为空的最快方法是什么 有没有比这更快更好的方法: function count_obj(obj){ var i = 0; for(var key in obj){ ++i; } return i; } 我假设空的意思是“没有自己的属性” 如果只需要处理,则可以使用而不是循环: 这将确保即使对象仅具有不可枚举的属性,isEmpty仍将为您提供正确的结果。对于ECMAScript 5(但并非所有浏览器都支持),您可以使用: Object
function count_obj(obj){
var i = 0;
for(var key in obj){
++i;
}
return i;
}
我假设空的意思是“没有自己的属性”
如果只需要处理,则可以使用而不是循环:
这将确保即使对象仅具有不可枚举的属性,isEmpty仍将为您提供正确的结果。对于ECMAScript 5(但并非所有浏览器都支持),您可以使用:
Object.keys(obj).length === 0
它可能有点黑。你可以试试这个
if (JSON.stringify(data).length === 2) {
// Do something
}
不确定这种方法是否有任何缺点。如果您不介意添加一个额外的库,每个方法都有一个方便的isEmpty()
函数
_.isEmpty({});
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;
}
编辑:请注意,您可能应该使用而不是此选项,因为ES5支持现在很流行。但它仍然适用于jQuery
使用
jQuery.isEmptyObject
,可以轻松地跨浏览器访问:
if ($.isEmptyObject(obj))
{
// do something
}
更多:
但是您需要jquery。不需要库
_.isEmpty({});
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;
}
“字典”对象的快速联机程序:
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;
}
很惊讶看到这么多关于JS的基本问题的答案如此之弱。。。最重要的答案也不好,原因如下:
未定义时返回true
,这本身速度非常慢
for…in
中的函数无效-返回false
而不使用hasOwnProperty
magic可以正常工作function isEmpty(value) {
return Boolean(value && typeof value === 'object') && !Object.keys(value).length;
}
优雅的方式-使用钥匙
var myEmptyObj = {};
var myFullObj = {"key":"value"};
console.log(Object.keys(myEmptyObj).length); //0
console.log(Object.keys(myFullObj).length); //1
非常方便:
_.isEmpty({}) // true
_.isEmpty() // true
_.isEmpty(null) // true
_.isEmpty("") // true
这有多糟
function(obj){
for(var key in obj){
return false; // not empty
}
return true; // empty
}
可能您可以使用此决定:
var isEmpty = function(obj) {
for (var key in obj)
if(obj.hasOwnProperty(key))
return false;
return true;
}
这是我的解决办法
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这里有一个很好的方法
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;
函数isArray(a){
返回Object.prototype.toString.call(a)=='[对象数组]'
}
功能对象(a){
返回Object.prototype.toString.call(a)=='[Object]'
}
函数为空(a){
如果(null==a | |“”==a)返回!0;
if(“number”==typeof a | |“string”==typeof a)返回!1;
变量b=!0;
如果(isArray(a)){
如果(!a.length)返回!0;
对于(var c=0;c
让我们把这个婴儿放到床上;在Node、Chrome、Firefox和IE 9下进行测试,很明显,对于大多数用例:
- (for…in…)是最快的使用选项强>
- Object.keys(obj)。空对象的长度要慢10倍
- JSON.stringify(obj)。长度总是最慢的(不足为奇)
- Object.getOwnPropertyNames(obj)。长度比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;
}
节点下的结果:
- 第一个结果:
return(Object.keys(obj.length==0)
- 第二个结果:
for(obj中的var x){return false;}…
- 第三个结果:
for(obj中的var x){if(obj.hasOwnProperty(x))返回false;}…
- 第四个结果:
return('{}'==JSON.stringify(obj))
注意,如果你的典型用例测试了一个非空的对象,只有很少的键,并且很少使用10个或更多的键来测试空的对象或对象,请考虑对象.KEY(OBJ)。否则,使用更通用的(for…in…)实现
请注意,Firefox似乎更快地支持Object.keys(obj).length和Object.getOwnPropertyNames(obj).length,这使它成为任何非空对象的更好选择,但当涉及空对象时,(for…in…)只需快10倍 我的2美分就是那个Object.keys(obj)。length是个糟糕的主意,因为它创建一个keys对象只是为了计算里面有多少个键,而不是破坏它!为了创建那个对象,他需要在关键点上循环。。。那么为什么要使用它而不是(for…in…)选项:)var a={};
函数timeit(func,count){
如果(!count)count=100000;
var start=Date.now();
对于(i=0;i我修改了Sean Vieira的代码以满足我的需要。null和undefined根本不算作对象,数字、布尔值和空字符串返回false
“严格使用”;
//加快对hasOwnProperty的调用
var hasOwnProperty=Object.prototype.hasOwnProperty;
var isObjectEmpty=函数(obj){
//null和undefined不为空
if(obj==null)返回false;
如果(obj==false)返回false;
if(obj==true)返回false;
if(obj==“”)返回false;
如果(对象类型==“编号”){
返回false;
}
//假设它的长度属性值为非零值
//那个属性是正确的。
如果(obj.length>0)返回false;
if(obj.length==0)返回
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
}
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;
}
var obj1= {};
var obj2= {test: "test"};
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
funtion isEmpty(o,i)
{
for(i in o)
{
return!1
}
return!0
}
var x= {}
var y= {x:'hi'}
console.log(Object.keys(x).length===0)
console.log(Object.keys(y).length===0)
true
false