js对象空值判断方法详解


今天在项目中发现一段代码用于判断对象是否为空,但由于对象中有一个属性值为 undefined,导致出现了bug。为了避免类似问题再次出现,决定干脆复习一下。

我们常用判断对象是否为空的方法,一般有以下。

1. Object.keys(obj).length === 0

1
2
3
const obj = {};
const isEmpty = Object.keys(obj).length === 0; // true
// 在这里是表现正常的,但是我们看下面的场景。

典型陷阱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 不可枚举属性案例
const obj = {};
Object.defineProperty(obj, 'pear', {
value: 'pearpear',
enumerable: false // 不可枚举
});
console.log(Object.keys(obj).length); // 输出 0

// Symbol 键案例
const sym = Symbol('key');
const obj = { [sym]: 'value' };
console.log(Object.keys(obj).length); // 输出 0

// 也就是说,对于不可枚举属性和Symbol键他是统计不出来的。

关键特性

• ✅ 统计对象自身的可枚举字符串属性
• ❌ 忽略不可枚举属性和 Symbol 键

2. JSON.stringify(obj) === '{}'

1
2
3
const obj = { a: undefined, b: function() {} };
const isEmpty = JSON.stringify(obj) === "{}"; // true
// 表现正常,看下面场景。

典型陷阱

1
2
3
4
5
6
7
8
const obj = {
a: undefined,
b: function() {}
};
const isEmpty = JSON.stringify(obj) === "{}";
console.log(obj, isEmpty); // {a: undefined, b: ƒ} true

// value为undefined或者函数他也是不统计的

关键特性

• ✅ 自动过滤 undefined 和函数

终极解决方案

Reflect.ownKeys(obj).length === 0

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const obj = {
a: undefined,
b: function() {}
};
const isEmpty = Reflect.ownKeys(obj) === "{}";
console.log(obj, isEmpty); // {a: undefined, b: ƒ} false

我们再试试 Object.defineProperty和Symbol
const obj = {};
Object.defineProperty(obj, 'pear', {
value: 'pearpear',
enumerable: false // 不可枚举
});
const isEmpty = Reflect.ownKeys(obj) === 0;
console.log(isEmpty); // false
---------------------------------
const sym = Symbol('key');
const obj = { [sym]: 'value' };
const isEmpty = Reflect.ownKeys(obj) === 0;
console.log(isEmpty); // false

关键特性

Reflect.ownKeys(obj) 是一个静态方法,用于返回指定对象的所有自身属性的键,包括:
• ✅ 可枚举属性:用 for…in 循环或 Object.keys() 获取到的属性。
• ✅ 不可枚举属性:使用 Object.getOwnPropertyNames() 获取的属性。
• ✅ 符号属性:使用 Object.getOwnPropertySymbols() 获取的属性。

我的微信公众号: 梨的前端小屋


文章作者: 梨啊梨
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 梨啊梨 !
  目录