首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用for...in循环时,数组索引不响应严格相等

是因为for...in循环是用于遍历对象的属性,而不是用于遍历数组的索引。在JavaScript中,数组也是一种特殊的对象,它的索引被视为属性,但是for...in循环并不保证按照数组索引的顺序进行遍历,而且还会遍历对象的原型链上的属性。

由于for...in循环的特性,当使用for...in循环遍历数组时,可能会出现一些意外的结果。例如,如果数组中存在非数字类型的属性,或者数组被扩展了原型链上的属性,这些属性也会被遍历到。此外,for...in循环还会遍历数组的内置方法和属性,如length、push、pop等,这可能会导致不符合预期的结果。

为了避免这种情况,我们通常建议使用for...of循环来遍历数组。for...of循环是ES6引入的一种新的循环语法,它专门用于遍历可迭代对象,包括数组、字符串、Set、Map等。与for...in循环不同,for...of循环会按照数组索引的顺序进行遍历,并且只遍历数组的元素,而不会遍历原型链上的属性或内置方法。

以下是一个使用for...of循环遍历数组的示例代码:

代码语言:txt
复制
const arr = [1, 2, 3, 4, 5];

for (const item of arr) {
  console.log(item);
}

在上述代码中,for...of循环会依次输出数组arr中的每个元素。

总结起来,使用for...in循环遍历数组时,数组索引不响应严格相等是因为for...in循环是用于遍历对象的属性,不保证按照数组索引的顺序进行遍历,并且会遍历原型链上的属性和内置方法。为了避免这种情况,建议使用for...of循环来遍历数组。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【JavaScript】数组 ② ( JavaScript 数组索引 | JavaScript 遍历数组 | 使用 for 循环遍历数组 )

一、JavaScript 数组索引 1、数组索引 在 JavaScript 中 , 数组 的 " 索引 " 又称为 " 下标 " , 从 0 开始计数 , 是 可用于访问 数组元素 的 " 序号 " ;...通过 数组索引 可以 访问 / 获取 / 修改 对应的数组元素 , 语法如下 : 数组名称[索引] 访问数组 元素 , 要注意数组的边界 , 如果尝试访问一个不存在的索引 , 会返回 undefined...0 ~ 2 索引对应的元素 , 访问第 4 个元素获取的值为 undefined ; 二、JavaScript 遍历数组 1、使用 for 循环遍历数组 JavaScript 中 使用 for 循环遍历数组...是 最常用的方式 ; 循环控制变量 初始化为 0 , 然后每次循环累加 1 , 循环 数组元素个数 次 , 这样就能实现 数组的完整遍历 ; 使用 arr.length 可以获取 arr 数组的长度...for 循环遍历数组 - 代码示例 代码示例 : <!

9810

JavaScript学习笔记

与所有其他值都不相等,包括自己; null:表示一个空的值,与0和空字符串''不同,0是一个数值,''表示长度为0的字符串,而null表示”空”; undefined:表示”未定义”; 数组定义方式,...索引起始值为0: new Array(1, 2, 3); 直接使用[], [1, 2, 4]; 对象都是一组由键-值组成的无序集合,键都是字符串类型,如果键中含特殊字符,就必须用”括起来,访问用...,也不会改变字符串; 直接给Array的length赋新值会导致Array大小的变化,可以通过索引改变对应元素的值,索引超过范围同样引起Array大小的变化; push()向Array末尾添加若干元素...通过for...of循环来遍历; for...in遍历的是对象的属性名称,for...of循环的是集合本身的元素,更好的方式是使用内置的forEach方法,接受一个函数,每次迭代自动回调函数; let代替...返回函数不要引用任何循环变量或者后续会发生变化的变量; 箭头函数,相当于匿名函数,含多个参数,要用()括起来;

85420

如何在JavaScript中使用for循环

每当循环语句在一个集合中的项中循环,我们称之为一个「迭代」。 有两种方式可以访问集合中的项。第一种方式是通过它在集合中的键,也就是数组中的索引或对象中的属性。...然而,这个输出的顺序与初始化对象创建的项的索引顺序不同。 在数组使用for…in循环 在JavaScript中使用for...in循环来迭代数组,在这种情况下,key将是元素的索引。...不使用for…in循环的情形 现在让我们来看看for...in循环不是最佳选择的情况。 数组的有序迭代 由于使用for...in循环不能保证迭代中的索引顺序,如果有必要保持顺序,建议不要迭代数组。...在IE中,当使用for...in循环,它将遍历一开始就在数组中的四个项目,然后再遍历在索引3的位置添加的那一项。 迭代进行更改 对属性的任何添加、删除或修改都不能保证有序的迭代。...总结 通过使用JavaScript for...in循环,我们可以循环对象的键或属性。在迭代对象属性或进行调试,它可能很有用,但在迭代数组或对对象进行修改时,应该避免使用for...in循环

5K10

lodash源码分析之compact中的遍历

数组中的for循环 使用 for 循环,很容易就将 compact 中关于循环部分的源码改写成以下形式: for (let i = 0; i < array.length; i++) { const...在数组中,数组索引是可枚举属性,可以用 for...in 来遍历数组索引数组中的稀疏部分不存在索引,可以避免用 for 循环造成无效遍历的弊端。...for...in 的遍历顺序依赖于执行环境,不同执行环境的实现方式可能会不一样。单凭这一点,就断然不能在数组遍历中使用 for...in,大多数情况下,顺序对于数组的遍历都相当重要。...当我们在控制台中打印一个数组,并将它展开来查看,会在数组的原型链上发现一个很特别的属性 Symbol.iterator。...done属性值为 true 停止。

99200

lodash源码分析之compact中的遍历

数组中的for循环 使用 for 循环,很容易就将 compact 中关于循环部分的源码改写成以下形式: for (let i = 0; i < array.length; i++) { const...在数组中,数组索引是可枚举属性,可以用 for...in 来遍历数组索引数组中的稀疏部分不存在索引,可以避免用 for 循环造成无效遍历的弊端。...for...in 的遍历顺序依赖于执行环境,不同执行环境的实现方式可能会不一样。单凭这一点,就断然不能在数组遍历中使用 for...in,大多数情况下,顺序对于数组的遍历都相当重要。...当我们在控制台中打印一个数组,并将它展开来查看,会在数组的原型链上发现一个很特别的属性 Symbol.iterator。...done属性值为 true 停止。

77160

JavaScript 新手的踩坑日记

宽松相等带来的bug 在 JavaScript 中有两种方式来判断两个值是否相等严格相等 ( === ) 和严格不等 ( !== ) 要求比较的值必须是相同的类型。...宽松相等 ( == ) 和宽松不等 ( != ) 会先尝试将两个不同类型的值进行转换,然后再使用严格等进行比较。...判断它直接用 宽松相等 == ,或者严格相等 === 判断即可。...循环方式 遍历对象 副作用 for 写法比较麻烦 for-in 索引值(键名),而非数组元素 遍历所有(非索引)属性,以及继承过来的属性(可以用hasOwnProperty()方法排除继承属性),主要是为遍历对象而设计的...Iterator 接口 遍历对象的属性,ES6 中有6种方法: 循环方式 遍历对象 for...in 循环遍历对象自身的和继承的可枚举属性(不包含Symbol属性)) Object.key(obj)

10810

对象的扩展

Function构造函数创造的函数,name属性返回anonymous 如果对象的方法是一个 Symbol 值,那么name属性返回的是这个 Symbol 值的描述 Object.is() 用来比较两个值是否严格相等...,与严格比较运算符(===)的行为基本一致 不同之处只有两个:一是+0不等于-0,二是NaN等于自身 Object.assign() Object.assign方法用于对象的合并,将源对象(source...对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为 Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象 for...in循环:只遍历对象自身的和继承的可枚举的属性...该方法与Object.setPrototypeOf方法配套,用于读取一个对象的原型对象 super 关键字 ES6 又新增了另一个类似的关键字super,指向当前对象的原型对象 super关键字表示原型对象,...所有可遍历(enumerable)属性的键名 ES2017 引入了跟Object.keys配套的Object.values和Object.entries,作为遍历一个对象的补充手段,供for...of循环使用

70630

JavaScript 新手的踩坑日记

宽松相等带来的bug 在 JavaScript 中有两种方式来判断两个值是否相等严格相等 ( === ) 和严格不等 ( !== ) 要求比较的值必须是相同的类型。...宽松相等 ( == ) 和宽松不等 ( != ) 会先尝试将两个不同类型的值进行转换,然后再使用严格等进行比较。...判断它直接用 宽松相等 == ,或者严格相等 === 判断即可。...循环方式 遍历对象 副作用 for 写法比较麻烦 for-in 索引值(键名),而非数组元素 遍历所有(非索引)属性,以及继承过来的属性(可以用hasOwnProperty()方法排除继承属性),主要是为遍历对象而设计的...Iterator 接口 遍历对象的属性,ES6 中有6种方法: 循环方式 遍历对象 for...in 循环遍历对象自身的和继承的可枚举属性(不包含Symbol属性)) Object.key(obj)

58020

Iterator 和 for-of 循环

使用for...of循环遍历某种数据结构,该循环会自动去寻找 Iterator 接口。 一种数据结构只要部署了 Iterator 接口,我们就称这种数据结构是“可遍历的”(iterable)。...不过,严格地说,对象部署遍历器接口并不是很必要,因为这时对象实际上被当作 Map 结构使用,ES5 没有 Map 结构,而 ES6 原生提供了。...如果要通过for...of循环,获取数组索引,可以借助数组实例的entries方法和keys方法(参见《数组的扩展》一章)。...for...of循环调用遍历器接口,数组的遍历器接口只返回具有数字索引的属性。这一点跟for...in循环也不一样。...某些情况下,for...in循环会以任意顺序遍历键名。 总之,for...in循环主要是为遍历对象而设计的,不适用于遍历数组。 for...of循环相比上面几种做法,有一些显著的优点。

54720

JS中遍历语法的比较

,但是for...in循环是以字符串作为键名“0”、“1”、“2”等等。...for...in循环主要是为遍历对象而设计的,不适用于遍历数组 for...of for…of是ES6新增的遍历方式,它提供了统一的遍历机制。...for...of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、Generator 对象,以及字符串 优点: 有着同...for...in一样的简洁语法,但是没有for...in那些缺点 不同用于forEach方法,它可以与break、continue和return配合使用 提供了遍历所有数据结构的统一操作接口 下面是一个使用...如果当前项大于1000,就会使用break语句跳出for...of循环。 for...of获取索引 entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成的数组

4.8K40

为什么不推荐用for...in遍历数组

但是最近一个网友在使用的时候却出现了异常报错,异常代码使用了一个for...in遍历数组: for (let idx in selectors) { let elementList = dom.querySelectorAll...img 而for...in会遍历出原型上的这些方法,这就导致在执行前面的代码,把一个函数作为参数传递给了querySelectorAll,导致报错!...二、for...in细节 for...in本身是Object的遍历方法,JS中的数组也继承自Object,所以自然而然也能使用for...in遍历出属性。...因此即便在一定范围内是按顺序遍历的,也应该尽量不依赖for...in遍历的顺序。MDN文档也明确指出,不建议使用for...in遍历数组,特别是想按照索引顺序遍历的时候: ?...因为for...in本身是对象的遍历方法,并不适用于数组,对于数组,还是for...of、for循环、forEach等遍历比较好。 ❤️爱心三连击

1.3K20

for 循环的 5 种写法,哪种最快?

但在实际开发中我们要结合语义话、可读性和程序性能,去选择究竟使用哪种方案。下面来看for , foreach , map , for...in , for...of五种方法现场battle。...定义一个变量i(数字类型,表示数组的下标),按照一定的条件,对i进行循环累加。条件通常为循环对象的长度,当超过长度就停止循环。因为对象无法判断长度,所以搭配Object.keys()使用。...遍历数组数组的下标当作键值,此时的i是个字符串型的。它是为遍历对象属性而构建的,不建议与数组一起使用。 for...of ES6 提出。只遍历可迭代对象的数据。...在回调函数里面使用break肯定是非法的,因为break只能用于跳出循环,回调函数不是循环体。...此时建议使用 forEach 对于纯对象的遍历,选择for..in枚举更方便;对于数组遍历,如果不需要知道索引for..of迭代更合适,因为还可以中断;如果需要知道索引,则forEach()更合适;对于其他字符串

89720

如果再写 for 循环,我就锤自己!

但在实际开发中我们要结合语义话、可读性和程序性能,去选择究竟使用哪种方案。下面来看for , foreach , map ,for...in , for...of五种方法现场battle。...定义一个变量i(数字类型,表示数组的下标),按照一定的条件,对i进行循环累加。条件通常为循环对象的长度,当超过长度就停止循环。因为对象无法判断长度,所以搭配Object.keys()使用。...遍历数组数组的下标当作键值,此时的i是个字符串型的。它是为遍历对象属性而构建的,不建议与数组一起使用。 for...of ES6 提出。只遍历可迭代对象的数据。...在回调函数里面使用break肯定是非法的,因为break只能用于跳出循环,回调函数不是循环体。...此时建议使用 forEach 对于纯对象的遍历,选择for..in枚举更方便;对于数组遍历,如果不需要知道索引for..of迭代更合适,因为还可以中断;如果需要知道索引,则forEach()更合适;对于其他字符串

45850

JS中的那些循环

index 当前处理元素索引 * @param {*} array forEach操作的数组 * @param {*} thisArg 执行回调函数绑定的this, 对箭头函数无效 * @returns...; 虽然遍历范围不变, 仍为 4, 但因为数组长度减小了, 所以会按最新的数组顺序 [2,3,4] 进行遍历, 且无法遍历到之前最后一个索引 [3]const a = [1, 2, 3, 4];a.forEach...遍历数组是按索引进行遍历const intance = [1, 2];for (const prop in intance) { console.log(`intance[${prop}] = ${...return、break、throw随时退出中断, 可以使用continue跳过某次循环const iterable = [1, 2, 3];for (const v of iterable) { if...6、map: 549.118ms, 会对数组进行浅拷贝, 并返回新数组, 耗时较长7、for...in: 2.222s, 耗时最长, 因为会访问到对象的原型上

2K10
领券