You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:35:16