在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我该如何检查是否是这种情况?
在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我该如何检查是否是这种情况?
当前回答
使用JSON.stringify怎么样?它几乎可以在所有现代浏览器中使用。
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
其他回答
警告当心JSON的限制。
javascript:
obj={ f:function(){} };
alert( "Beware!! obj is NOT empty!\n\nobj = { f:function(){} }" +
"\n\nJSON.stringify( obj )\n\nreturns\n\n" +
JSON.stringify( obj ) );
显示器
Beware!! obj is NOT empty! obj = { f:function(){} } JSON.stringify( obj ) returns {}
我的看法:
函数isEmpty(obj){return Object.keys(obj).length==0;}变量a={a: 1中,b: 2个}变量b={}console.log(isEmpty(a));//假的console.log(isEmpty(b));//真的
只是,我认为目前并不是所有浏览器都实现Object.keys()。
IsEmpty Object意外地失去了它的含义,即:它是编程语义,当我们著名的Yahoo专家将定制的非枚举对象财产引入ECMA并被接受时。
[如果您不喜欢历史-请直接跳到工作代码]
对于这个问题,我看到了很多好的答案。然而,获取ECMA脚本的最新扩展并不是一条诚实的道路。我们过去为了保持网景4.x和基于网景的网页的工作和项目的活力而阻止了网络的发展,而这些网页(顺便说一句)是极其原始的向后和独特的,拒绝使用新的W3C标准和主张(在当时这是非常革命性的,对程序员来说是友好的),而现在却对我们自己的遗产残酷无情。
杀死Internet Explorer 11是完全错误的!是的,一些自“冷战”时代以来一直蛰伏在微软内部的老战士同意了这一点——理由是错误的但这并不正确!
在你的答案中使用一个新引入的方法\属性,并将其作为一个发现(“它一直存在,但我们没有注意到它”),而不是一个新发明(就其真实情况而言),有点“绿色”和有害。大约20年前,我曾经犯过这样的错误,当时我仍然无法分辨其中已经存在的东西,并将我能找到的一切作为参考,作为一个共同的工作解决方案。。。
向后兼容性很重要!
我们只是还不知道。这就是为什么我需要分享我的“百年”通用解决方案的原因,该解决方案仍然向后和向前兼容,以适应不可预见的未来。
对in运算符的攻击很多,但我认为这样做的人终于有了理智,真正开始理解和欣赏真正的动态类型语言,如JavaScript及其美丽的本质。
我的方法旨在简单和核心,出于上述原因,我不称其为“空”,因为该词的含义不再准确。是可枚举的,似乎是具有确切含义的词。
function isEnum( x ) { for( var p in x )return!0; return!1 };
一些用例:
isEnum({1:0})
true
isEnum({})
false
isEnum(null)
false
感谢阅读!
我真不敢相信,经过两年的js编程,它从来没有点击过空对象和数组都不是假的,最奇怪的是它从来没有让我发现。
如果默认情况下输入为false,或者输入为空对象或数组,则返回true。逆函数是真正的函数
http://codepen.io/synthet1c/pen/pjmoWL
function falsish( obj ){
if( (typeof obj === 'number' && obj > 0) || obj === true ){
return false;
}
return !!obj
? !Object.keys( obj ).length
: true;
}
function trueish( obj ){
return !falsish( obj );
}
falsish({}) //=> true
falsish({foo:'bar'}) //=> false
falsish([]) //=> true
falsish(['foo']) //=> false
falsish(false) //=> true
falsish(true) //=> false
// the rest are on codepen
完美的故障保护解决方案
我认为第一个被接受的解决方案在大多数情况下都有效,但不是故障保护。
更好的故障安全解决方案将是。
function isEmptyObject() {
return toString.call(obj) === "[object Object]"
&& Object.keys(obj).length === 0;
}
或ES6/7
const isEmptyObject = () => toString.call(obj) === "[object Object]"
&& Object.keys(obj).length === 0;
使用这种方法,如果obj设置为undefined或null,则代码不会中断。并返回null。