| 方法 | 描述 | 遍历不可枚举属性 | 遍历继承属性 | 遍历Symbol属性 |
|---|---|---|---|---|
| Object.keys(obj) Object.values(obj) Object.entries(obj) | 所有键名 所有键值 [[键名,键值],[键名,键值]] | × | × | × |
| for-in | 键名 | × | √ | × |
| Object.hasOwnProperty () | 判断是否存在某个key | × | √ | × |
| Object.getOwnPropertyNames() | 键名 | √ | × | × |
| Object.getOwnPropertySymbols() | 获取symbol对象的键名 | - | - | √ |
| Reflect.ownKeys(obj) | 键名 | √ | × | √ |
Object.keys()方法会返回一个由给定对象的自身可枚举属性组成的数组
如果Object.keys()返回的迭代器对象长度为0,说明该对象是空对象。
function objectIsNull(obj){
if(Object.keys(obj).length== 0) return true;
else return false;
}
还需要判断是否为对象的构造函数,在JS中有9个内置构造函数,调用该函数返回的结果都为true。还需要考虑边界情况比如null或者undefined
new Object();
new String();
new Number();
new Boolean();
new Array();
new RegExp();
new Function();
new Date();
new Error();
objectIsNull(new String()); //true
//TypeError
Object.keys(null).length === 0;
Object.keys(undefined).length === 0;
修改版本
function objectIsNull(obj){
return obj&& Object.keys(obj).length === 0 && obj.constructor === Object;
}
如果属性是Symbol对象,这个函数会判断错误
const a = { [Symbol()]: 'a' }
objectIsNull(a); //false
可以通过Object.getOwnPropertySymbols()方法判断是否存在Symbol对象
function objectIsNull(obj){
return obj&& Object.keys(obj).length === 0 && obj.constructor === Object && Object.getOwnPropertySymbols(b).length === 0;
}
如果不可枚举对象也需要判断,那么可以将Object.keys换成Object.getOwnPropertyName
function objectIsNull(obj){
return obj&& Object.getOwnPropertyNames(obj).length === 0 && obj.constructor === Object && Object.getOwnPropertySymbols(b).length === 0;
}
Reflect.ownKeys 方法返回一个由目标对象自身的属性键组成的数组。它的返回值等同Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))
1.如果目标不是Object会抛出TypeError错误
2.自身的属性,包括了Symbol对象的属性和不可枚举属性
function objectIsNull(obj){
return Reflect.ownKeys(c).length === 0// true
}