JavaScript 遍历对象
shell
# 普通遍历:只遍历对象自身、可枚举的属性,不包含原型链、Symbol、不可枚举属性。
for...in + if (obj.hasOwnProperty(key)) # 遍历自身 或者 自身和原型链属性
Object.keys() + forEach # 遍历对象 key 数组
Object.values() + forEach # 遍历对象 value 数组
Object.entries() + for...of # 彻底解构遍历对象
# 包含 Symbol 属性的遍历,以上方法遍历不到 Symbol 类型的 key
Object.getOwnPropertySymbols() # 只获取自身 Symbol 属性
Reflect.ownKeys() # 自身所有属性(字符串 + Symbol + 不可枚举)
# 包含不可枚举属性的遍历
Object.getOwnPropertyNames() # 获取自身所有属性(包括不可枚举,不含 Symbol)
# 遍历自身属性和原型链属性
for...in(不加 hasOwnProperty)
# 二维键值对数据转对象
Object.fromEntries案例
const obj = { name: "小明", age: 18 };
for...in
最经典,但是要注意原型链属性
js
for (let key in obj) {
console.log(key, obj[key]); // name 小明, age 18
}
for (let key in obj) {
if (obj.hasOwnProperty(key)) { // 只保留自身属性
console.log(key, obj[key]);
}
}Object.keys() + forEach
对象 key 数组
js
Object.keys(obj).forEach(key => {console.log(key, obj[key])});Object.values() + forEach
对象 value 数组
js
Object.values(obj).forEach(val => console.log(val));Object.entries() + for...of
对象 键值对 数组
js
for (let [key, val] of Object.entries(obj)) {
console.log(key, val);
}Object.getOwnPropertySymbols()
只获取自身 Symbol 属性
js
const sym = Symbol('age');
const obj = { name: '小明', [sym]: 18 };
Object.getOwnPropertySymbols(obj).forEach(key => {
console.log(key, obj[key]);
});Reflect.ownKeys()
最强遍历:自身所有属性(字符串 + Symbol + 不可枚举)
js
Reflect.ownKeys(obj).forEach(key => {
console.log(key, obj[key]);
});Object.getOwnPropertyNames()
最强遍历:自身所有属性(字符串 + Symbol + 不可枚举)
js
// 例:数组的 length 是不可枚举属性
const arr = [1, 2];
Object.getOwnPropertyNames(arr); // ["0", "1", "length"]