JavaScript中是否存在`for...in`语句的实用调试替代方案?
替代
for...in获取包含继承属性的键数组方案 首先要明确:for...in的核心行为是遍历对象自身及其原型链上所有可枚举的属性键,而Object.keys()仅返回对象自身的可枚举属性,Object.getOwnPropertyNames()返回对象自身的所有属性(无论是否可枚举),这就是它们结果不一致的原因。
要实现和for...in完全等效的键数组,可以手动遍历对象的原型链,逐层收集可枚举属性,同时跳过重复的键(因为for...in会优先取自身属性,原型链上的同名属性不会重复出现)。
实现代码
function getAllEnumerableKeys(obj) { const keys = new Set(); let currentObj = obj; // 遍历整个原型链 while (currentObj !== null) { // 收集当前对象自身的可枚举属性 Object.keys(currentObj).forEach(key => keys.add(key)); // 往上移动一层原型 currentObj = Object.getPrototypeOf(currentObj); } return Array.from(keys); } // 测试你的例子 var myp = document.createElement('p'); var a = []; for (var each in myp) { a.push(each); } var d = getAllEnumerableKeys(myp); console.log(a.length === d.length); // 应该返回true console.log(new Set(a).size === new Set(d).size); // 键集合完全一致
说明
- 使用
Set自动去重,确保每个键只保留一个(和for...in中优先取自身属性、忽略原型链同名属性的行为一致) - 通过
Object.getPrototypeOf()逐层遍历原型链,直到null(原型链的终点) - 最终把
Set转为数组,得到和for...in遍历结果完全一致的键集合
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

