ECMAScript 2020:for-in 循环的更改

阅读时长 4 分钟读完

在 ECMAScript 2020 标准中,for-in 循环有了一些重大的更改。这些更改主要是为了提高代码的可读性和安全性。在本文中,我们将深入探讨这些更改,并提供代码示例以帮助您了解它们的使用方法。

for-in 循环的问题

在过去,for-in 循环被广泛用于遍历对象的属性。然而,它有一个主要的问题,就是它会遍历对象的原型链。这意味着在遍历对象的属性时,可能会遍历到来自其原型的属性。这可能会导致一些意外的结果,并使代码难以理解和调试。

例如,考虑以下代码:

-- -------------------- ---- -------
--- --- - -
  ---- -----
--

-------------------- - ------

--- ---- ---- -- ---- -
  ------------------
-
展开代码

这段代码将输出 foobaz。虽然我们只期望输出 foo,但由于 baz 是从 Object.prototype 继承而来的,它也被遍历到了。

更改:只遍历对象自身的属性

为了解决 for-in 循环的问题,ECMAScript 2020 引入了一个新的方法:Object.getOwnPropertyNames()。这个方法返回一个数组,其中包含对象的所有自身属性的名称(不包括从原型继承的属性)。

使用 Object.getOwnPropertyNames(),我们可以重写上面的示例代码:

-- -------------------- ---- -------
--- --- - -
  ---- -----
--

-------------------- - ------

--- ---- ---- -- -------------------------------- -
  ------------------
-
展开代码

这段代码将只输出 foo,因为 baz 是从 Object.prototype 继承而来的,不是 obj 自身的属性。

更改:禁止遍历原型链

除了 Object.getOwnPropertyNames(),ECMAScript 2020 还引入了一个新的方法:Reflect.ownKeys()。这个方法返回一个数组,其中包含对象的所有自身属性的名称和符号(包括从原型继承的符号属性)。

使用 Reflect.ownKeys(),我们可以完全禁止遍历对象的原型链:

-- -------------------- ---- -------
--- --- - -
  ---- -----
--

-------------------- - ------

--- ---- ---- -- --------------------- -
  ------------------
-
展开代码

这段代码将只输出 foo,因为它只遍历了 obj 自身的属性,而没有遍历 Object.prototype 中的属性。

结论

在 ECMAScript 2020 中,for-in 循环的更改提高了代码的可读性和安全性。通过使用 Object.getOwnPropertyNames()Reflect.ownKeys(),我们可以轻松地遍历对象的自身属性,而不必担心遍历其原型链。这些更改使代码更易于理解和调试,并减少了可能导致错误的风险。

参考资料

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6767c25998e3e1ab1a7aaf4a

纠错
反馈

纠错反馈

程序员教程

精选优质教程,助你快速提升技术实力

程序员面试题库

海量优质面试题,助你轻松应对技术面试