JavaScript 为什么使用“for…in”循环来迭代数组是一个不好的主意

JavaScript 为什么使用“for…in”循环来迭代数组是一个不好的主意

for…in循环是一个用于迭代对象所有可枚举属性的JavaScript循环语句。该循环遍历对象的所有键或属性名,允许您访问相应的值。

语法:

for (variable in object) {
      // Code to be executed
}

在这里,变量被分配给对象中的每个属性名。循环遍历对象的每个属性,在每次迭代中将属性名分配给变量。然后可以使用属性名访问相应的属性值。

为什么使用“for…in”循环来遍历数组是个坏主意?

通常认为使用 for…in 循环来遍历数组是个坏主意,因为它遍历对象的所有可枚举属性,而不仅仅是数组元素。这意味着它也可以遍历非索引属性,比如添加到数组原型或任何其他已添加的对象属性。

示例:

Javascript

Array.prototype.foo = 'hello'; 
const arr = [1, 2, 3]; 
  
for (let key in arr) { 
      console.log(key); 
}

输出:

JavaScript 为什么使用“for…in”循环来迭代数组是一个不好的主意

在给定的示例中, for…in 循环也会对Array原型的foo属性进行迭代,这不是我们期望的。如果您依赖循环仅遍历数组元素,这可能会导致意外结果。

缺点: 让我们看看使用“for…in”循环的一些更多缺点:

  • 它遍历所有可枚举属性: for…in循环遍历对象的所有可枚举属性,包括其原型链中的属性。如果不了解这个行为,这可能会导致意外的结果,因为它可能包括您不打算迭代的属性。
  • 比其他循环方法慢: for…in循环可能比其他循环方法(如for或while循环)慢,因为它必须在每次迭代时查找属性名。当迭代大型数组或对象时,此开销可能变得明显。
  • 它不保证迭代顺序: for…in循环不保证迭代顺序,这意味着属性的返回顺序可能与其定义的顺序不同。如果您依赖属性的顺序来正确执行代码,这可能会导致问题。
  • 它可能包括不可枚举属性: 某些对象可能具有不可枚举的属性,这意味着它们不会在for…in循环中包含。这可能导致迭代中丢失属性。
  • 不建议用于迭代数组: 虽然可以使用for…in循环遍历数组,但不推荐,因为它可能包括除数组元素以外的属性,例如数组的原型链中的属性。相反,建议使用for、while、for…of或数组特定的方法,如forEach、map、filter和reduce。

总体而言,for…in循环在JavaScript中可以是一个有用的工具,但是应该注意其限制,并根据特定的用例适当地使用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程