【问题标题】:Modern equivalent of for... in loop?现代相当于 for... 在循环中?
【发布时间】:2021-04-02 13:10:41
【问题描述】:

我从网络档案中继承了一个精简的代码库作为个人项目。

其中有很多:

for (var keyCodeName in keyCodeByName) {
   // something happens
}

是否存在与这种类型的 for 循环相同的现代等价物?当我尝试研究它时,我迷失在“可枚举的属性”中。

【问题讨论】:

  • 这取决于something happens 做了什么
  • for...in 循环有什么问题?为什么需要更换?
  • for...in 存在一些问题,如果使用不当,one article here
  • 迭代键的等效项是Object.keys(myObj).forEach(),但乍一看我不明白为什么要更改它...

标签: javascript


【解决方案1】:

最接近的等价物是用forEach()循环Object.keys()

Object.keys(keyCodeByName).forEach(keyCodeName => {
    // something happens
});

这其实大致相当于下面的循环:

for (let keyCodeName in keyCodeByName) {
    if (keyCodeByName.hasOwnProperty(keyCodeName)) {
        // something happens
    }
}

因为Object.keys() 只返回自己的 属性,而for-in 也会处理继承的属性。

许多程序员忘记进行hasOwnProperty() 检查,并且在大多数情况下它是无害的,因为没有一个继承的属性是可枚举的。因此,如果您尝试转换的代码没有检查,则更有可能他们没有意识到他们需要它,而不是他们真的想要处理继承的属性。所以使用Object.keys() 可能更接近预期的行为。

When do I need to use hasOwnProperty()?

【讨论】:

  • 这正是我所追求的基本解释。感谢您抽出宝贵时间编写它 Barmar。在 TypeScript 中,此检查标记为严格模式,并且是我需要的缺失键。
  • object.hasOwnProperty() 检查不再需要,因为您提出的关于继承属性不可枚举的观点。如果您要添加可枚举的继承属性,那么您做错了什么,或者您使用的旧浏览器不允许您更改可枚举性。仍然进行检查的唯一原因是支持旧浏览器。使用 for...in 没有任何问题。它比使用 Object.keys() 和 .forEach() 更有效
  • @PHPGuru True,我链接到的问题有一个网站链接,解释了为什么没有必要。但它也假定人们会以正确的方式扩展Object.prototype(使用definePropertyenumerable: false),这不是你可以一直指望的。
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2016-09-21
相关资源
最近更新 更多