Js实现allkeys
实现 allKeys 方法
allKeys 方法的目标是获取对象及其原型链上的所有可枚举属性名。以下是几种实现方式:

使用 for...in 循环
function allKeys(obj) {
const keys = [];
for (const key in obj) {
keys.push(key);
}
return keys;
}
结合 Object.getOwnPropertyNames 和递归
如果需要包含不可枚举属性,可以递归遍历原型链:

function allKeys(obj, includeNonEnumerable = false) {
const keys = new Set();
let current = obj;
while (current !== null && current !== Object.prototype) {
const currentKeys = includeNonEnumerable
? Object.getOwnPropertyNames(current)
: Object.keys(current);
currentKeys.forEach(key => keys.add(key));
current = Object.getPrototypeOf(current);
}
return Array.from(keys);
}
使用 Reflect.ownKeys
Reflect.ownKeys 可以获取对象的所有属性(包括符号属性):
function allKeys(obj) {
const keys = new Set();
let current = obj;
while (current !== null && current !== Object.prototype) {
Reflect.ownKeys(current).forEach(key => keys.add(key));
current = Object.getPrototypeOf(current);
}
return Array.from(keys);
}
注意事项
- 原型链终止条件:避免遍历到
Object.prototype或null,否则会包含不必要的内置方法(如toString)。 - 性能考虑:递归遍历原型链可能对性能有影响,尤其是在深层次的原型链中。
- 符号属性:如果需要包含符号属性,使用
Reflect.ownKeys或Object.getOwnPropertySymbols。






