for in 循环判断
function isNullObj(obj) {
for (const key in obj) {
if (obj.hasOwnProperty(key)) return false
}
return true
}
这里注意for…in和for…of遍历的区别:
for…in:
for…in 语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。引入enumerable的最初目的,就是让某些属性可以规避掉for…in操作。比如,对象原型的toString方法,以及数组的length属性,就通过这种手段,不会被for…in遍历到。
js 中的基本包装类型的原型属性是不可枚举的,如Object,Array,Number等
- 可枚举属性决定了这个属性能否被for…in遍历到
- 遍历得到的是String类型的键名
- 原型链上的属性都能被访问到
- for-in 这个代码是为普通对象设计的,不适用于数组的遍历
for…of:
for…of语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments,DOM数组对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句
- for…of 语句遍历出来的是值
- 可以保证遍历顺序
区别:
- 推荐在遍历对象的时候使用for in ,在遍历数组的时候使用for of 。
- for…of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象.与forEach()不同的是,它可以正确响应break、continue和return语句
- for-of循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用for-in循环(这也是它的本职工作)或内建的Object.keys()方法
Object.key()
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致。
const obj1 = {}
const obj2 = {
key1: 'a',
key2: 'b',
}
Object.prototype.key1 = 'c'
/* 1.Object的api */
// Object.keys()
console.log(Object.keys(obj1).length);
console.log(Object.keys(obj2).length);
// Object.entries()
console.log(Object.entries(obj1).length);
console.log(Object.entries(obj2).length);
// Object.getOwnPropertyNames()
console.log(Object.getOwnPropertyNames(obj1).length);
console.log(Object.getOwnPropertyNames(obj2).length);
JSON.stringify()
通过JSON.stringify,序列化对象自身的可枚举属性
function isNullObj2(obj) {
return JSON.stringify(obj) === '{}'
}