
提示:要判断一个对象是否真正"空",不仅检查自身属性,还要检查原型链上的自定义属性和方法,可以使用以下几种方法:
1. 检查对象自身及原型链上的所有可枚举属性
function isObjectTrulyEmpty(obj) {
// 处理 null 和 undefined
if (obj == null) return true;
// 检查对象自身属性(包括不可枚举的)
const ownProps = Object.getOwnPropertyNames(obj);
if (ownProps.length > 0) return false;
// 检查原型链上的自定义属性
let proto = Object.getPrototypeOf(obj);
while (proto && proto !== Object.prototype) {
const protoProps = Object.getOwnPropertyNames(proto);
if (protoProps.length > 0) return false;
proto = Object.getPrototypeOf(proto);
}
return true;
}
2. 使用 Reflect.ownKeys() 检查更全面的属性
function isObjectCompletelyEmpty(obj) {
if (obj == null) return true;
// 检查自身所有属性(包括Symbol)
if (Reflect.ownKeys(obj).length > 0) return false;
// 检查原型链
let proto = Object.getPrototypeOf(obj);
while (proto && proto !== Object.prototype) {
if (Reflect.ownKeys(proto).length > 0) return false;
proto = Object.getPrototypeOf(proto);
}
return true;
}
3. 检查对象是否只有默认的原型方法
function hasOnlyDefaultPrototypeMethods(obj) {
if (obj == null) return true;
// 获取对象自身所有属性
const ownProps = Object.getOwnPropertyNames(obj);
if (ownProps.length > 0) return false;
// 获取对象原型
const proto = Object.getPrototypeOf(obj);
if (!proto) return true;
// 获取默认Object.prototype上的方法
const defaultProps = Object.getOwnPropertyNames(Object.prototype);
// 比较当前原型上的属性与默认属性
const currentProps = Object.getOwnPropertyNames(proto);
return currentProps.every(prop => defaultProps.includes(prop));
}
使用示例
const emptyObj = {};
const objWithProto = Object.create({ customMethod: () => {} });
const objWithSymbol = { [Symbol('key')]: 'value' };
console.log(isObjectTrulyEmpty(emptyObj)); // true
console.log(isObjectTrulyEmpty(objWithProto)); // false
console.log(isObjectCompletelyEmpty(objWithSymbol)); // false
console.log(hasOnlyDefaultPrototypeMethods(emptyObj)); // true
注意事项
- 这些方法会忽略JavaScript内置的原型方法(如Object.prototype上的方法)
- 对于Symbol属性,需要使用Reflect.ownKeys()而不是Object.getOwnPropertyNames()
- 这些方法不会检查对象的不可枚举属性,如果需要检查,需要使用Object.getOwnPropertyDescriptors()
- 对于特殊对象如Array、Date等,它们的原型链上有额外的方法,需要特殊处理
如果需要更精确的检查,可以根据具体需求调整上述函数。

被折叠的 条评论
为什么被折叠?



