5.如何判断一个对象为空及for..in/of
如何判断一个对象为空?
判断一个对象为空有很多种方法
方法一: 将对象转为字符串,与"{}"进行比较
jsconst a = {} console.log(JSON.stringify(a) == '{}') // true
方法二: 通过for...in循环判断
只有当对象不为空(可遍历时),for循环才会执行,返回false,否则返回true
jsconst a = {} for(let i in a) { return false } return true
方法三: 通过Object.keys()方法判断
Object.keys()返回一个数组,数组内包含了对象的所有键(keys),通过数组的长度,来判断对象是否为空
js
const a = {}
const keyArrs = Object.keys(a) // []
console.log(keyArrs.length) // 0
- 方法四: 通过Object.getOwnPropertyNames()判断
Object.getOwnPropertyNames()返回一个数组,其元素是与给定对象 obj 直接关联的可枚举和不可枚举属性对应的字符串。
js
const a = {}
const keyArrs = Object.getOwnPropertyNames(a) // []
console.log(keyArrs.length) // 0
for...in和for...of
for...in
for...in返回的是数据结构的键名。遍历对象返回的是对象的key,遍历数组返回的是数组的下标。(会遍历原型上的值和手动添加的值)
for...of
for...of获取一对键值中的值。一个数据结构只要部署了Symbol.iterator属性,就被视为具有iterator接口,可以使用for...of。for...of不同于forEach,for of是可以break,continue,return配合使用,for of 循环可以随时退出循环。
Symbol.iterator
哪些数据结构部署了Symbol。iterator属性? 以下数据解构有iterator接口:
- Array
- Map
- Set
- String
- arguments
- Nodelist
部署了iterator接口的数据结构都可以使用数组的扩展运算符和解构赋值等