JS 获取对象属性名的方法和区别
在 JavaScript 中想获取某一个对象的属性名,有多种方法可供选择。
for in
Object.keys
Object.getOwnPropertyNames
Object.getOwnPropertySymbols
Reflect.ownKeys
在获取对象属性名的众多方法中,其实有各自的区别和用途,但经常容易被混淆,本篇文章会将这些方法的区别介绍清楚。
创建对象案例
下面来创建一个对象的案例让这些方法来获取属性,再通过结果来看区别。
const parent = Object.create(Object.prototype, {
a: {
value: 1,
writable: true,
enumerable: true,
configurable: true
},
b: {
value: 2,
writable: true,
enumerable: false,
configurable: true
},
[Symbol('symbolParent')]: {
value: 3,
writable: true,
enumerable: true,
configurable: true
}
});
const child = Object.create(parent, {
c: {
value: 4,
writable: true,
enumerable: true,
configurable: true
},
d: {
value: 5,
writable: true,
enumerable: false,
configurable: true
},
[Symbol('symbolChild')]: {
value: 6,
writable: true,
enumerable: true,
configurable: true
}
});
在上面我们创建了一个对象 parent,上面创建了两个普通属性 a(可枚举)、b(不可枚举)和一个键为 Symbol 类型的属性 symbolParent,创建了一个对象 child 继承自 parent,上面创建了两个普通属性 c(可枚举)、d(不可枚举)和一个键为 Symbol 类型的属性 symbolChild。
for...in
for (let k in child) {
console.log(k);
}
// c
// a
从结果来看,for...in 先遍历并获取到了自身的部分属性名,又获取到了继承的部分属性名。
总结:for...in 可以遍历自身和继承的、可枚举的、非 Symbol 类型的属性。
Object.keys
Object.keys(child);
// ["c"]
从结果来看,Object.keys 返回了一个数组,里面存储获取的属性的键名,不能获取继承的属性名,只能获取自身的部分属性名,这种效果相当于 for...in 与 hasOwnProperty 方法的组合。
for (let k in child) {
if (child.hasOwnProperty(k)) {
console.log(k);
}
}
// c
总结:Object.keys 只能遍历自身的、可枚举的、非 Symbol 类型的属性。
Object.getOwnPropertyNames
Object.getOwnPropertyNames(child);
// ["c", "d"]
从结果看,Object.getOwnPropertyNames 方法返回了一个数组,存储获取对象属性的键名。
总结:Object.getOwnPropertyNames 只能遍历自身的(包含不可枚举)、非 Symbol 类型的属性。
Object.getOwnPropertySymbols
Object.getOwnPropertySymbols(child);
// [Symbol(symbolChild)]
从结果看,Object.getOwnPropertySymbols 方法返回了一个数组,存储的都是 Symbol 类型的键,说明是专门用来处理 Symbol 类型的。
总结:Object.getOwnPropertySymbols 只能遍历自身 Symbol 类型的属性。
Reflect.ownKeys
Reflect.ownKeys(child);
// ["c", "d", Symbol(symbolChild)]
Reflect.ownKeys 的返回值为数组,存储遍历到的属性名。
总结:Reflect.ownKeys 可以遍历自身的所有属性(包含不可枚举和 Symbol 类型)。
- 点赞
- 收藏
- 关注作者
评论(0)