当前位置: 首页 > 面试题库 >

JavaScript为什么在数组迭代中使用“ for…in”是个坏主意?

欧阳昊阳
2023-03-14
问题内容

有人告诉我不要for...in在JavaScript中使用数组。为什么不?


问题答案:

原因是一种构造:

var a = []; // Create a new empty array.

a[5] = 5;   // Perfectly legal JavaScript that resizes the array.



for (var i = 0; i < a.length; i++) {

    // Iterate over numeric indexes from 0 to 5, as everyone expects.

    console.log(a[i]);

}



/* Will display:

   undefined

   undefined

   undefined

   undefined

   undefined

   5

*/

有时可能与另一个完全不同:

var a = [];

a[5] = 5;

for (var x in a) {

    // Shows only the explicitly set index of "5", and ignores 0-4

    console.log(x);

}



/* Will display:

   5

*/

还请注意,JavaScript库可能会执行以下操作,这会影响您创建的任何数组:

// Somewhere deep in your JavaScript library...

Array.prototype.foo = 1;



// Now you have no idea what the below code will do.

var a = [1, 2, 3, 4, 5];

for (var x in a){

    // Now foo is a part of EVERY array and

    // will show up here as a value of 'x'.

    console.log(x);

}



/* Will display:

   0

   1

   2

   3

   4

   foo

*/


 类似资料:
  • 本文向大家介绍为什么在JavaScript数组迭代中使用“ for…in”循环是个坏主意?,包括了为什么在JavaScript数组迭代中使用“ for…in”循环是个坏主意?的使用技巧和注意事项,需要的朋友参考一下 在大多数情况下,通常最好使用' for '循环而不是“ for ... in ”循环,因为“ for ... in ”循环会产生索引 ,而不会打扰剩余的索引普通的“ for ”循环显示

  • 我对redis是新的,所以我不知道更多关于它复杂的技术细节。但是让我把我的场景放在这里:我在同一个服务器上运行两个网站,我希望redis在这两个网站上工作。在搜索中,我发现可以通过如下所示为同一服务器实例上的不同数据库分配不同的索引来做到这一点: 这对我来说是理想的,因为我可以在同一个实例中缓存我的两个数据库。但后来我碰到了多个Redis数据库有什么意义?如何在redis数据库之间进行转换?链接上

  • 问题内容: 为什么Catch(Exception)一个坏主意? 问题答案: 因为当你捕获异常时,你应该正确处理它。而且,你不能期望在代码中处理所有类型的异常。同样,当你捕获所有异常时,你可能会得到一个无法处理的异常,并阻止堆栈中位于较高位置的代码正确处理它。 一般原则是捕获可能的最特定类型。

  • 我正在考虑写一些代码,可以归结为以下几点是一种集合类型(当前为,如果有必要的话)。 我的问题是,像这样把复制到是不是一个坏主意?糟糕的风格?可能会惹恼某个学究?根据类型的细微细节是否可能中断? 我不希望在这个循环运行时被破坏,也不希望任何元素被添加或删除。 一方面,我对迭代器的了解表明,这应该是完全安全的。但另一方面,我对迭代器有些不了解,这感觉有点粗略,所以我想问一下。 增编: 出现这种情况的另

  • 问题内容: eval函数是一种动态生成代码的强大而简便的方法,那么有哪些警告? 问题答案: 错误使用 eval会 打开代码以进行注入攻击 调试 可能会更具挑战性(没有行号等) 评估的代码执行速度较慢(没有机会编译/缓存评估的代码) 编辑:正如@Jeff Walden在评论中指出的那样,今天#3的真实性要低于2008年。但是,尽管可能会缓存一些已编译脚本,但这只会限于未经修改就重复的脚本。更有可能的

  • 问题内容: 如数组和字典 实例方法中所述: 以与for-in循环相同的顺序在 序列 中的每个元素上调用给定的闭包。 尽管如此,改编自序列概述: 序列是您可以一次浏览一个值的列表。遍历序列元素 的最常见方法 是使用 for-in循环 。 或表示该迭代序列: 或(数组): 将给出相同的输出。 为什么还要存在?即使用它而不是循环有什么好处?从性能角度来看,它们是相同的吗? 作为一个假设,它可能是语法糖,