为什么JavaScript的For … In循环不推荐用于数组?
作者:互联网
参见英文答案 > Why is using “for…in” with array iteration a bad idea? 27个
我读到某处(对不起,我找不到链接),不推荐For … In循环用于数组.在这里说:http://www.openjs.com/articles/for_loop.php它用于关联数组,在http://www.w3schools.com/js/js_loop_for_in.asp用于迭代对象的所有属性(它没有说它可以在数组上使用).我不知道该相信谁.我不希望这个问题成为辩论.我只是想知道我是否可以在我的代码中使用它而没有不可预见的副作用.谢谢!
解决方法:
数组是一个对象,数组元素只是将数字索引转换为字符串的属性.例如,arr [123]引用数组对象arr中的属性“123”.
for … in构造适用于所有对象,而不仅仅是数组,这是造成混淆的原因.
当有人在…中使用数组时,程序员通常只想迭代所有元素,甚至最有可能按顺序迭代.例如,如果数组包含一堆数字,那么程序员很可能打算迭代一个数字流.语义与其他编程语言中的数组迭代非常相似,因此很容易混淆.
在JavaScript中,此构造不会按顺序迭代数组元素.它迭代所有数组的属性名称(包括继承的原型函数的名称,添加到它的任何属性,添加到它的任何其他非元素属性等),而不是按顺序.在早期的浏览器中,它甚至会找到属性长度,尽管在最近的浏览器中,这些属性现在被定义为隐藏在这个确切的原因 – 人们不断绊倒它!
使用上面的整数数组,您不会获得数字流,而是获得文本字符串流.而不是元素值,而是属性的名称(它们只是不以任何顺序排列的数字索引).如果他/她来自另一种编程语言,这很可能不是程序员的意思.如果存储在数组中的元素碰巧是类似的数值,那么它会让每个人都感到困惑.
这就是你不应该这样做的原因.你不应该使用看起来像它做一些明显的事情的语言结构,但实际上做的事情是完全不同的.它会产生非常模糊且很难找到的错误.
标签:for-in-loop,javascript 来源: https://codeday.me/bug/20191001/1838586.html