最推荐用 Object.keys(obj).length === 0 判断对象是否为空,它只检查自身可枚举属性、兼容性好、性能优;若需检测不可枚举属性或 Symbol 键,应改用 Reflect.ownKeys(obj).length === 0。

最直接可靠的方式是用 Object.keys(obj).length === 0。它只检查对象自身的可枚举属性,不涉及原型链,兼容性好、性能优,适合绝大多数日常场景。
用 Object.keys() 检查可枚举属性
这是当前开发中最推荐的方法。Object.keys() 返回一个包含对象所有自身可枚举属性名的数组,长度为 0 就说明没属性。
- ✅ 简洁明了,一行就能写完判断逻辑
- ✅ 不受原型链干扰(比如不会把 Object.prototype.toString 当作属性)
- ❌ 不会检测不可枚举属性或 Symbol 属性(如通过 Object.defineProperty 设置的 enumerable: false 属性)
用 for...in + hasOwnProperty 过滤继承属性
当需要手动控制遍历过程,或运行环境较老(如需兼容 IE8),可用这个组合。for...in 会遍历所有可枚举属性(含继承的),必须配合 hasOwnProperty 排除原型上的属性。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- ✅ 兼容性强,ES3 起就支持
- ✅ 明确区分“自身属性”和“继承属性”
- ❌ 写法略长,容易漏掉 hasOwnProperty 判断,导致误判
用 Object.getOwnPropertyNames() 或 Reflect.ownKeys()
这两个方法能拿到对象自身的全部属性名(包括不可枚举属性)。Reflect.ownKeys 还额外包含 Symbol 类型的键。
- Object.getOwnPropertyNames(obj).length === 0:覆盖不可枚举属性,但不处理 Symbol
- Reflect.ownKeys(obj).length === 0:最全面,涵盖字符串键和 Symbol 键
- ⚠️ 注意:如果对象有不可枚举属性(比如某些库内部设置的属性),仅用 Object.keys 可能误判为“空”,这时需按需升级检查方式
慎用 JSON.stringify(obj) === '{}'
虽然写起来短,但存在明显隐患:
- ❌ 遇到 function、undefined、Symbol、BigInt 或循环引用时会丢失字段或直接报错
- ❌ 性能较差(要序列化整个对象再比字符串)
- ❌ 对 Date、RegExp 等内置对象可能产生意外结果(如 new Date() → "2026-10-13T06:28:00.000Z")

















