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