今天在项目中发现一段代码用于判断对象是否为空
,但由于对象中有一个属性值为 undefined
,导致出现了bug。为了避免类似问题再次出现,决定干脆复习一下。
我们常用判断对象是否为空的方法,一般有以下。
1. Object.keys(obj).length === 0
1 2 3
| const obj = {}; const isEmpty = Object.keys(obj).length === 0;
|
典型陷阱
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);
const sym = Symbol('key'); const obj = { [sym]: 'value' }; console.log(Object.keys(obj).length);
|
关键特性
• ✅ 统计对象自身的可枚举字符串属性
• ❌ 忽略不可枚举属性和 Symbol 键
2. JSON.stringify(obj) === '{}'
1 2 3
| const obj = { a: undefined, b: function() {} }; const isEmpty = JSON.stringify(obj) === "{}";
|
典型陷阱
1 2 3 4 5 6 7 8
| const obj = { a: undefined, b: function() {} }; const isEmpty = JSON.stringify(obj) === "{}"; console.log(obj, isEmpty);
|
关键特性
• ✅ 自动过滤 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); 我们再试试 Object.defineProperty和Symbol const obj = {}; Object.defineProperty(obj, 'pear', { value: 'pearpear', enumerable: false }); const isEmpty = Reflect.ownKeys(obj) === 0; console.log(isEmpty); --------------------------------- const sym = Symbol('key'); const obj = { [sym]: 'value' }; const isEmpty = Reflect.ownKeys(obj) === 0; console.log(isEmpty);
|
关键特性
Reflect.ownKeys(obj) 是一个静态方法,用于返回指定对象的所有自身属性的键
,包括:
• ✅ 可枚举属性
:用 for…in 循环或 Object.keys() 获取到的属性。
• ✅ 不可枚举属性
:使用 Object.getOwnPropertyNames() 获取的属性。
• ✅ 符号属性
:使用 Object.getOwnPropertySymbols() 获取的属性。
我的微信公众号: 梨的前端小屋