Javascript for in的缺陷总结

Javascript for in 的缺陷总结

在 JavaScript 中,for...in 是一种迭代对象属性的方式。尽管它是一种非常方便的方法,但它也存在一些缺陷。

1. 不保证顺序

使用 for...in 迭代对象属性时,并不能保证属性被迭代的顺序。这是因为对象属性在 JavaScript 内部是以无序集合的形式存储的。如果你需要按照特定顺序迭代对象属性,那么应该考虑使用 Object.keys()Object.getOwnPropertyNames() 方法。

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

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

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

2. 继承属性会被迭代

for...in 迭代对象属性时,除了迭代对象自身的属性外,还会迭代其原型链上的属性。这意味着,继承来的属性也会被迭代到。

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

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

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

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

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

如果你不希望迭代到继承来的属性,可以使用 Object.hasOwnProperty() 方法进行过滤。

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

3. 迭代非数字键名的数组

for...in 可以用于迭代数组,但是它会把非数字键名的元素也迭代出来。这可能会导致一些意想不到的问题。因为 JavaScript 中数组也是对象,在数组中添加非数字键名的元素时,该元素会成为数组对象的属性。

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

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

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

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

因此,在迭代数组时,应该使用传统的 for 循环或者 Array.prototype.forEach() 方法,而不是 for...in

结论

虽然 for...in 迭代对象属性非常方便,但是在实际开发中需要注意它的缺陷。在需要按顺序迭代对象属性、不需要迭代继承来的属性或者迭代数组时,应该选择合适的方法。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/2386