JavaScript对象是否为空的检测方法

JavaScript对象是否为空的检测方法

技术背景

在JavaScript开发中,特别是在处理AJAX请求返回的数据时,经常会遇到需要判断一个对象是否为空的情况。一个空对象通常指的是没有任何自有属性的对象,例如 var a = {}。准确判断对象是否为空对于程序的逻辑判断和错误处理非常重要。

实现步骤

1. 使用 for...in 循环结合 Object.hasOwn(ECMA 2022+)

1
2
3
4
5
6
7
8
function isEmpty(obj) {
for (const prop in obj) {
if (Object.hasOwn(obj, prop)) {
return false;
}
}
return true;
}

如果需要区分类似 {} 的空对象和其他没有自有属性的对象(如 Date 对象),可以进行类型检查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function isEmptyObject(value) {
if (value == null) {
// null or undefined
return false;
}
if (typeof value !== 'object') {
// boolean, number, string, function, etc.
return false;
}
const proto = Object.getPrototypeOf(value);
// consider `Object.create(null)`, commonly used as a safe map
// before `Map` support, an empty object as well as `{}`
if (proto !== null && proto !== Object.prototype) {
return false;
}
return isEmpty(value);
}

对于不支持ES 2022+的JavaScript引擎,可以将 const 替换为 var,将 Object.hasOwn 替换为 Object.prototype.hasOwnProperty.call

1
2
3
4
5
6
7
8
function isEmpty(obj) {
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
return false;
}
}
return true;
}

2. 使用 Object.keys()(ECMAScript 5+)

1
2
3
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}

对于ES3及更早版本,需要显式循环遍历属性:

1
2
3
4
5
6
7
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}

3. 使用第三方库

  • jQuery
1
jQuery.isEmptyObject({}); // true
  • lodash
1
_.isEmpty({}); // true
  • Underscore
1
_.isEmpty({}); // true
  • Hoek
1
Hoek.deepEqual({}, {}); // true
  • ExtJS
1
Ext.Object.isEmpty({}); // true
  • AngularJS(版本1)
1
angular.equals({}, {}); // true
  • Ramda
1
R.isEmpty({}); // true

4. 使用 JSON.stringify()

1
2
3
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}

核心代码

以下是几种常见方法的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// 使用 for...in 循环
function isEmptyForIn(obj) {
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
return false;
}
}
return true;
}

// 使用 Object.keys()
function isEmptyKeys(obj) {
return Object.keys(obj).length === 0;
}

// 使用 JSON.stringify()
function isEmptyStringify(obj) {
return JSON.stringify(obj) === '{}';
}

// 使用 jQuery
function isEmptyJQuery(obj) {
return jQuery.isEmptyObject(obj);
}

// 使用 lodash
function isEmptyLodash(obj) {
return _.isEmpty(obj);
}

// 测试对象
var emptyObj = {};
var nonEmptyObj = { key: 'value' };

console.log(isEmptyForIn(emptyObj)); // true
console.log(isEmptyForIn(nonEmptyObj)); // false

console.log(isEmptyKeys(emptyObj)); // true
console.log(isEmptyKeys(nonEmptyObj)); // false

console.log(isEmptyStringify(emptyObj)); // true
console.log(isEmptyStringify(nonEmptyObj)); // false

console.log(isEmptyJQuery(emptyObj)); // true
console.log(isEmptyJQuery(nonEmptyObj)); // false

console.log(isEmptyLodash(emptyObj)); // true
console.log(isEmptyLodash(nonEmptyObj)); // false

最佳实践

  • 性能优先:如果性能是关键因素,推荐使用 for...in 循环结合 Object.hasOwnObject.prototype.hasOwnProperty.call 的方法,因为 Object.keys() 会创建一个包含所有属性名的数组,复杂度为O(N),而 for...in 循环的复杂度为O(1)。
  • 兼容性考虑:如果需要支持旧版本的JavaScript引擎,避免使用 Object.hasOwnObject.keys() 等ES5及以上的特性,使用 for...in 循环和 Object.prototype.hasOwnProperty.call 来实现。
  • 使用第三方库:如果项目中已经使用了jQuery、lodash等第三方库,可以直接使用它们提供的方法,这样可以减少代码量和提高开发效率。

常见问题

  • Object.keys() 方法的误导性Object.keys(new Date()).length === 0 会返回 true,但 Date 对象并不是真正意义上的空对象。因此,在使用 Object.keys() 方法时,需要注意对象的类型。
  • JSON.stringify() 方法的性能和可靠性问题JSON.stringify() 方法在处理包含函数或循环引用的对象时会出现问题,并且性能较低。因此,不建议在性能敏感的场景中使用该方法。
  • 第三方库的依赖问题:使用第三方库会增加项目的依赖和体积,因此在引入第三方库时需要谨慎考虑。

JavaScript对象是否为空的检测方法
https://119291.xyz/posts/2025-04-22.detection-methods-for-empty-javascript-objects/
作者
ww
发布于
2025年4月22日
许可协议