当前位置: 首页 > article >正文

for...in 和 Object.keys().forEach的区别


for…in 和 Object.keys().forEach的区别

1、遍历范围:

for…in 会遍历 自身及原型链上的可枚举属性,需用 hasOwnProperty 过滤。

Object.keys() 仅遍历 自身可枚举属性,更安全。

// 定义一个父对象,包含原型链上的属性
const parent = { inheritedProp: '来自原型链的属性' };
// 创建子对象,继承父对象
const child = Object.create(parent);
// 添加子对象自身的属性
child.ownProp = '子对象自身的属性';

// -------------------------------
// 测试 for...in
console.log('for...in 遍历结果:');
for (const key in child) {
  console.log(key); // 输出 ownProp 和 inheritedProp
}

// -------------------------------
// 测试 Object.keys().forEach
console.log('Object.keys().forEach 遍历结果:');
Object.keys(child).forEach((key) => {
  console.log(key); // 仅输出 ownProp
});

// 输出结果:
// for...in 遍历结果:       ownProp → inheritedProp
// Object.keys().forEach:  ownProp

2、顺序性:

for…in 的顺序不保证完全可靠(尤其旧浏览器或混合键名类型时)。

Object.keys() 严格按以下顺序:

数字键升序排列 → 字符串键插入顺序(ES6+规范)。

// 创建一个包含数字键和字符串键的对象
const obj = { a: 1, 0: 2, b: 3, 2: 4, 1: 5 };

// -------------------------------
// 测试 for...in 的顺序
console.log('for...in 顺序:');
for (const key in obj) {
  console.log(key); 
  // 可能输出顺序: 0 → 1 → 2 → a → b(数字键升序优先,字符串键按定义顺序)
}

// -------------------------------
// 测试 Object.keys().forEach 的顺序
console.log('Object.keys().forEach 顺序:');
Object.keys(obj).forEach((key) => {
  console.log(key); 
  // 输出顺序: 0 → 1 → 2 → a → b(严格遵循 ES6 规范的数字键升序 + 字符串键插入顺序)
});

// 输出结果(现代浏览器):
// for...in 顺序:        0 → 1 → 2 → a → b
// Object.keys().forEach: 0 → 1 → 2 → a → b
// 注意:规范未要求 for...in 的顺序一致性,某些特殊情况下可能不同!



http://www.kler.cn/a/521276.html

相关文章:

  • 穿心莲内酯(andrographolide)生物合成CYP72-文献精读106
  • 【MQ】如何保证消息队列的高可用?
  • 使用 C/C++ 调用 libcurl 调试消息
  • 关于低代码技术架构的思考
  • 12 款开源OCR发 PDF 识别框架
  • 深入理解若依RuoYi-Vue数据字典设计与实现
  • GO语言 链表(单向链表
  • 接口管理文档Yapi的安装与配置
  • 华硕笔记本装win10哪个版本好用分析_华硕笔记本装win10专业版图文教程
  • 无所不搜,吾爱制造
  • 深入 Rollup:从入门到精通(一)专栏介绍
  • 【Leetcode 热题 100】139. 单词拆分
  • Autogen_core: Quickstart
  • vulnhub靶场【kioptrix-2】靶机
  • 如何使用tushare pro获取股票数据——附爬虫代码以及tushare积分获取方式
  • Excel分区间统计分析(等步长、不等步长、多维度)
  • 瑞芯微方案:RV1126定制开发板方案定制
  • 【Elasticsearch 基础入门】Centos7下Elasticsearch 7.x安装与配置(单机)
  • 论文阅读(十六):利用线性链条件随机场模型检测阵列比较基因组杂交数据的拷贝数变异
  • DataSecOps的要点
  • 【JavaWeb学习Day13】
  • 基于Python的网易云音乐分析可视化系统的设计与实现
  • 实现一个安全且高效的图片上传接口:使用ASP.NET Core和SHA256哈希
  • Qt中Widget及其子类的相对位置移动
  • SQL 指南
  • LeetCode - Google 大模型校招10题 第1天 Attention 汇总 (3题)