首先第一个问题,forEach能不能遍历对象的属性
const obj = { a: 1, b: 2, c: 3 };
obj.forEach((item) => console.log(item))
运行这段代码我们发现发生了一个错误
这说明forEach是不可以遍历对象的属性的
在js中,forEach
方法用于遍历数组或类数组对象(如 NodeList
)
第二个问题,怎么遍历对象的不可枚举属性呢
这里有一个对象,我们定义了一个不可枚举属性
const obj = { a: 1, b: 2, c: 3 };// 定义一个不可枚举属性
Object.defineProperty(obj, 'd', {value: 4,enumerable: false,
});
我们可以通过两种方式来遍历不可枚举属性
- 可以通过
Object.defineProperty()
方法重新定义属性,将其enumerable
属性设置为true
,使其变得可枚举。 - 如果需要遍历对象的所有属性(包括不可枚举属性),可以使用
Object.getOwnPropertyNames()
方法。
Object.getOwnPropertyNames()
静态方法返回一个数组,其包含给定对象中所有自有属性(包括不可枚举属性,但不包括使用 symbol 值作为名称的属性)。
同时通过getOwnPropertyNames方法,我们就可以对其返回值调用forEach来进行遍历了
const obj = { a: 1, b: 2, c: 3 };// 定义一个不可枚举属性
Object.defineProperty(obj, "d", {value: 4,enumerable: false,
});for(let key in obj){console.log(key, obj[key])
}console.log('----------------------------------')// 使用 Object.getOwnPropertyNames() 和 forEach
Object.getOwnPropertyNames(obj).forEach((key) => {console.log(`${key}: ${obj[key]}`);
});