首页 > 其他分享 >为什么我不推荐使用for..in迭代数组元素

为什么我不推荐使用for..in迭代数组元素

时间:2022-11-08 15:06:25浏览次数:35  
标签:.. 迭代 prop hasOwnProperty 数组 array 属性

为什么我不推荐使用for..in迭代数组元素_数组


for-in语句的目的是枚举对象属性。该语句将在原型链中上升,还会枚举继承的属性,这有时是不希望的。

此外,规范不保证迭代的顺序,这意味着如果您想“迭代”一个数组对象,使用此语句您不能确定将按数字顺序访问属性(数组索引)。

例如,在 jscript (IE <= 8) 中,即使在 Array 对象上的枚举顺序也被定义为创建的属性:

var array = [];
array[2] = 'c';
array[1] = 'b';
array[0] = 'a';


for (var p in array) {
//... p will be "2", "1" and "0" on IE
}

此外,谈到继承的属性,例如,如果您扩展Array.prototype对象(如 MooTools 那样的某些库),则该属性也将被枚举:

Array.prototype.last = function () { return this[this.length-1]; };


for (var p in []) { // an empty array
// last will be enumerated
}

正如我之前所说的迭代数组或类似数组的对象,最好的方法是使用顺序循环,例如普通的for/while循环。

当您只想枚举对象的自身属性(未继承的属性)时,可以使用以下hasOwnProperty方法:

for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
// prop is not inherited
}
}

有些人甚至建议直接从 from 调用该方法,Object.prototype以避免在有人hasOwnProperty向我们的对象添加命名属性时出现问题:​

for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
// prop is not inherited
}
}

总结

不应该使用for..in迭代数组元素的三个原因:

  • for..in将遍历数组对象的所有自己和继承的属性,这些属性不是DontEnum;这意味着如果有人向特定的数组对象添加属性(有正当理由 - 我自己已经这样做了)或更改Array.prototype(这在应该与其他脚本一起工作的代码中被认为是不好的做法),这些属性将也被迭代;可以通过检查排除继承的属性hasOwnProperty(),但这对您在数组对象本身中设置的属性没有帮助。
  • for..in不能保证保留元素顺序。
  • 它很慢,因为您必须遍历数组对象及其整个原型链的所有属性,并且仍然只能获取属性的名称,即要获取值,需要进行额外的查找。



学习更多技能

请点击下方公众号


为什么我不推荐使用for..in迭代数组元素_原型链_02

为什么我不推荐使用for..in迭代数组元素_迭代_03

标签:..,迭代,prop,hasOwnProperty,数组,array,属性
From: https://blog.51cto.com/u_15809510/5833122

相关文章

  • 5种从JavaScript 数组中删除项目的方式
    英文| https://javascript.plainenglish.io/how-to-remove-an-item-from-a-javascript-array-in-5-ways-2932b2686442翻译|杨小二有很多方法可以从JavaScript数组中删......
  • 我在JavaScript开发项目中使用最多的9种数组方法
    英文|https://javascript.plainenglish.io/9-array-methods-that-i-used-the-most-while-making-20-projects-in-javascript-8aa299eb731翻译|杨小二我做后端编程以及很......
  • 8 个你应该知道的JavaScript 数组方法
    原文| https://javascript.plainenglish.io/8-javascript-array-methods-you-should-know-81947c9e46de原译|杨小二数组构成了几乎任何编程语言的组成部分。了解数组对......
  • 7个JavaScript中的基本数组方法
    原文| https://javascript.plainenglish.io/7-essential-array-methods-in-javascript-you-need-2021-246e2f3d6052原译|杨小二如果你正在寻找从数组中添加、删除或查找......
  • 4.寻找两个正序数组的中位数
    思路原问题难以直接递归求解,所以我们先考虑这样一个问题:在两个有序数组中,长度分别为n、m,找出第k小数。如果该问题可以解决,那么第k=(n+m)/2小数就是我们要求的中位......
  • React组件设计模式-纯组件,函数组件,高阶组件
    一、组件(1)函数组件如果你想写的组件只包含一个render方法,并且不包含state,那么使用函数组件就会更简单。我们不需要定义一个继承于React.Component的类,我们可以定......
  • 力扣209 长度最小的子数组
    题目:给定一个含有 n 个正整数的数组和一个正整数target。找出该数组中满足其和≥target的长度最小的连续子数组 [numsl,numsl+1,...,numsr-1,numsr],并返回......
  • 【JavaScript 教程】第六章 数组03— Stack :使用 Array 的push()和pop()方法实现堆栈
    英文 | https://www.javascripttutorial.net/译文|杨小爱在上节,我们学习了JavaScriptArray length属性以及如何正确处理它,错过的小伙伴可以点击文章《​​【JavaScrip......
  • JavaScript数组去重—ES6的两种方式
    说明JavaScript数组去重这个问题,经常出现在面试题中,以前也写过一篇数组去重的文章,(JavaScript数组去重的多种方法原理详解)但感觉代码还是有点不够简单,今天和大家再说两种......
  • 实验4 类与数组、指针
    2022.11.02OOP实验课实验4类与数组、指针任务5代码:vectorInt54.hpp#pragmaonce#include<iostream>#include<cassert>#include<iomanip>usingnamespace......