A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

将json对象转化为json字符串,再判断该字符串是否为"{}"var obj = {};var b = (JSON.stringify(obj) === "{}");console.log(b); // true
  • 1
  • 2
  • 3
for in 循环判断var obj = {};var b = function() {    for(var key in obj) {        return false;    }    return true;}console.log(b()); // true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

网上很多都是如上的说法,但是会存在一个问题,就是如果obj=null ,obj=undefined,obj="",obj=[],obj=0 以及obj为任意数字也返回true,所以有了下面这个for in 循环判断:

方案一:

var obj = {};var b = function() {    for(var key in obj) {        return false;    }    if(obj === null || typeof obj !== "object" || Array.isArray(obj)){        return false;    }    return true;}console.log(b()); // true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

方案二:

var obj = {};var b = function() {    for(var key in obj) {        return false;    }    if(obj === null || typeof obj !== "object" || Object.prototype.toString.call(obj) === "[object Array]"){        return false;    }    return true;}console.log(b()); // true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

上面两种方案的区别就是判断判断空数组的方式不同。

jQuery的jQuery.isEmptyObject(obj)方法var obj = {};var b = $.isEmptyObject(obj);console.log(b); // true
  • 1
  • 2
  • 3

jQuery.isEmptyObject(obj) 方法依然存在obj=null ,obj=undefined,obj="",obj=[],obj=0 以及obj为任意数字返回true的问题,所以我们还应该再用typeof 或者 $.type() 判断一下:

var obj = {};var b = $.isEmptyObject(obj) && $.type(obj) === "object";console.log(b); // true
  • 1
  • 2
  • 3
var obj = {};var b = $.isEmptyObject(obj) && typeof obj === "object" && obj !== null && !Array.isArray(obj);console.log(b); // true
  • 1
  • 2
  • 3
var obj = {};var b = $.isEmptyObject(obj) && typeof obj === "object" && obj !== null && Object.prototype.toString.call(obj) !== "[object Array]";console.log(b); // true
  • 1
  • 2
  • 3
Object.getOwnPropertyNames()方法

Object.getOwnPropertyNames() 方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。

var obj = {};var b = !Object.getOwnPropertyNames(obj).length;console.log(b); // true
  • 1
  • 2
  • 3

Object.getOwnPropertyNames() 方法存在obj=0 以及obj为任意数字返回true的问题,所以我们还应该再用typeof 判断一下:

var obj = {};var b = !Object.getOwnPropertyNames(obj).length && typeof obj === "object";console.log(b); // true
  • 1
  • 2
  • 3
Object.keys()方法

Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 。

var obj = {};var b = !Object.keys(obj).length;console.log(b); // true
  • 1
  • 2
  • 3

Object.keys() 方法存在obj="",obj=[],obj=0 以及obj为任意数字返回true的问题,所以依旧需要加判断如下:

var obj = {};var b = !Object.keys(obj).length && typeof obj === "object" && !Array.isArray(obj);console.log(b); // true
  • 1
  • 2
  • 3
var obj = {};var b = !Object.keys(obj).length && typeof obj === "object" && Object.prototype.toString.call(obj) !== "[object Array]";console.log(b); // true
  • 1
  • 2
  • 3
如果对象不为空,并且知道对象不为空时,某个属性一定存在,则直接判断这个对象的此属性是否存在。

1 个回复

倒序浏览
奈斯,加油加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马