JavaScript使用for循环时出现的问题

这个问题的讨论最初来自公司内部邮件,我只是把这个问题的讨论内容记录下来。

有一些项目组在定位问题的时候发现,在使用“for(x in array)”这样的写法的时候,在IE浏览器下,x出现了非预期的值。

具体说,如果自定义了Array.prototype.indexOf方法(譬如源于某prototype污染),也许是因为老版本IE浏览器并不支持array.indexOf方法,而开发者又很想用,那么这样的浏览器可能会出现这样的问题:

1
2
3
Array.prototype.indexOf = function (){...};
var arr = [1, 2];
for (x in arr) console.log(x);

//会输出

1
2
function(){…}

换句话说,把indexOf这个方法给输出出来了。

解决方法很简单,要么别添加这个方法,要么用“for (i=0; i < array.length; i++)”这样的循环等等。

但是问题的本质呢?有人猜测,可能是因为for(x in obj)这种用法其实是去遍历一个对象,而array的实现其实也和普通的object一致,只不过key是既定的数值而已:

1
{0: "something" , 1: "something else" }

在一则stackoverflow的问答里面也提到了,遍历数组的时候用for…in和for(;;)的区别,前者的含义是枚举对象的属性,存在这样两个问题:

  • 枚举的顺序无法被保证;
  • 继承属性也被枚举出来;

在对Array.prototype.forEach的支持上,从这张表中也可以明确看到,IE8及以下版本是无法准确支持的:

JavaScript使用for循环时出现的问题

这里还有对forEach方法兼容性的详细阐述。事实上,主要的JavaScript框架(比如jQuery、Underscore和Prototype等等)都有安全和通用的for-each功能实现。

在JSLint的for in章节里面也提到,for in语句允许循环遍历对象的属性名,但是也会遍历到那些通过原型链继承下来的属性,这在很多情况下都会造成预期以外的错误。有一种粗暴的解决办法:

1
for (name in object) { if (object.hasOwnProperty(name)) { .... } }

还有人提到了使用for(var i=0;i<length;i++)类似这样的循环时的问题,因为JavaScript没有代码块级别的变量,所以这里的i的访问权限其实是所在的方法。有的书上会建议程序员把这样的变量声明放到一处去,但是从直观性上说,在大部分情况下都不够合理。使用JavaScript 1.7中引入的“let”可以解决这个问题,使i成为真正的代码块级别的变量:

1
for (let i =0; i < a.length; i++)

最后,在Google的JavaScript风格导引里面,也涉及到了这个约束:

for-in loop:
Only for iterating over keys in an object/map/hash

文章系本人原创,转载请保持完整性并注明出自《四火的唠叨》

高通开发系列 - System之FOTA/DFOTA包制作和升级 阅读详情

相关推荐

2025海外代理IP深度横评:Bright Data、IPFoxy、SmartProxy等六大服务商实战对比

本文深度横评2025年六大海外代理IP服务商(Bright Data、IPFoxy、SmartProxy、IPIPGO、Kookeey及青果网络),基于实战测试数据,从IP池质量、速度稳定性、性价比等维度进行对比。针对跨境电商、数据爬虫、社交媒体管理等不同业务场景,提供精准的选购指南与避坑建议,帮助企业用户根据自身需求选择最合适的代理IP解决方案。

weixin_29196891的博客 434

js的直接赋值导致在循环中赋值失败的问题

写js遇到了一个问题,就是说我在for循环值通过循环的值给一个对象赋值,但是的话每次赋值打印的结果都为最后一次赋的值,然后我就开始了debugger,发现我debug执行的话并没有问题,但是如果不debug就还会出现所有的赋值都是最后一个值得问题,这是我的代码 var poster_name = this.More_Temp_count['posterity_name'] ...

小僵尸打字员的博客 5483

SPSS27 paired t-test 中的Cohen’s D – Effect Size for T-Test

两组数据是相关的且是连续的。

moonlightpeng的博客 910

关于js中 var在for循环中出现错误的问题思考

关于js var在for循环时出现问题的个人理解

qq_43429963的博客 2430

【目标跟踪】ECO算法论文阅读:ECO: Efficient Convolution Operators for Tracking

这里所指的训练集是指保存了每一帧的跟踪结果的训练集,也就是说,每一次进行model update的时候,要用在这一帧之前所有跟踪到的样本。那么随着视频越来越长,这个训练集就会越来越大。因为当目标被遮挡或者丢失的时候,比较新的这些样本本身就是错的,那么模型很容易有model drift,就是被背景或者错误的目标污染,导致跟踪结果出错。如下图所示,Baseline是传统的训练集,每更新一帧就加一个进来,那么连续的数帧后训练集里面的样本都是高度相似的,即容易遗忘前面的样本,且容易对最近的若干帧样本过拟合。

qq_43799400的博客 2615

MySQL根据idb文件恢复数据

恢复前提 MySQL 5.* 和 8.* 的恢复方式大同小异,最基本的区别是8.* 中,不再有表结构frm文件,所以要恢复 8.* 的数据,就必须要有完整的建表语句。 而恢复 5.* 的数据,就需要idb文件和 frm文件,当然,如果有完整的建表语句的话,不用frm文件也行。 恢复步骤 需要注意的是,以下操作需要选定数据库后执行。 5.* 恢复表结构 确定表列数 首先创建一张 与需要恢复数据的表 的名字相同的新表,如果已知原表的字段数量的话,就按照原表字段数建表,字段名和类型都不用考虑,如果不知道数量的话,

weixin_45121446的博客 5449

for循环使用常见问题

1.for循环中出现异常,循环是否继续? 否 2.for循环中出现return,循环是否继续 ?否 转载于:https://www.cnblogs.com/john123/p/11518046.html

weixin_30488313的博客 683

【RTD】二分法查找和分段线性插值算法在RTD中应用

二分法查找和分段线性插值算法在RTD中的典型应用。

只要思想不滑坡,想法总比问题多。 2371

增强for循遍历数组输出时容易出现的错误

这里我们可以发现在for循环里有i和a两个变量,按照定义i是变量,a是数组名,但是我们一般操作数组时习惯用a[i]这种方式,容易混淆。而正确的方法是只用输出i就可以,在增强for循环里面的i就是我们给数组里面的元素起的变量名,并不是数组下标!这样就正确了,在初学的时候一定要搞清概念,这对以后有很大的帮助,像我一样的萌新们一定要注意啊!因为刚开始学习,对增强for循环的概念不太清楚,所以在遍历数组的时候总是出现下标越界的错误。这样就会报数组下标越界错误,而且输出的数组不正确(是没有输出1的)

weixin_56555958的博客 742

LVGL 源码分析大全

LVGL 是一款流行的免费和开源嵌入式图形库,为纯C的轻量级GUI框架,支持framebuffer直接渲染图层,因此LVGL能更容易为 MCU、MPU等显示设备开发漂亮的UI。可视化的 UI 编辑器官方上有推荐使用工具。当然,也可以选择 NXP(恩智浦半导体) 提供的工具。........................

Bigan(安)的博客 1万+

Modbus RTU 详解 + FreeMODBUS移植(附项目源码)

本文全面解析Modbus RTU通信协议,详细介绍其报文格式、功能码定义及典型应用场景,并手把手指导如何将FreeMODBUS协议栈移植到嵌入式平台。内容涵盖从底层硬件驱动配置、协议栈移植到主机/从机通信测试的全流程,重点讲解移植过程中的常见问题及解决方案。文章最后提供经过实测的完整项目源码,帮助开发者快速实现稳定的Modbus RTU通信功能。

Bit_Dong的博客 2926

splice(js)在for循环中使用时出现的问题

在写JS代码时,我们常常使用 splice 函数来删除数组中的元素,因为 splice 函数会直接对数组进行修改,从而不需再自己写一个算法来移动数组中的其他元素填补到被删除的位置。splice 功能十分强大,除了可以删除数组的元素之外,还可以删除的同时添加新的元素到删除的位置等等用法。在本篇文章中,我只介绍 splice 的删除数组元素的用法,和在 for 循环中使用 splice 时遇到过的坑,作为记录以免我下次忘记了这个坑。 在使用 splice 之前,必备条件是,要先有一个数组。。。 var a

ZJLOVE的博客 760

OSPF规划两大模型:双塔奇兵、犬牙交错

大家好,今天给大家带来的是OSPF规划两大模型:双塔奇兵、犬牙交错,让我们直接开始吧! OSPF规划之双塔奇兵 说明: OSPF 如果某个区域存在两个 ABR,并且在两个 ABR 上都对 area n 内的路由做了聚合操作。 最佳配置: 两台ABR之间的红线应该使用以太网的子接口技术,一个子接口属于area0,另一个属于 area n;或者该链路规划为 area n,同时配置虚连接; ABR 的 loopback0 规划入 area 0 OSPF 规划之犬牙交错 说明: 有时接入层的设备会以乱序的

网络技术联盟站 2423

当js中的for循环遇到延时器或者定时器时需要注意的问题

当你在for循环里写if判断,再加延时器或者定时器时,一定要保存当前的i的值,再做处理,否则你拿到的i的值会是for循环里最大的那个; 看demo for (var i = 0; i < 10; i++) { if(i == 5){ setTimeout(aa,2000); function aa(){ console.log( "i="+i); }

积少成多 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

日常-js原生for循环绑定事件时,引用循环里的变量,发现只是最后值的问题

今日疑惑:大for套小for,在非严格模式下, for (var i =5; i >= 0; i--) { // console.log(i);//5 4 3 2 1 0 // console.log(this);//window对象 for (var j =5; j >= 0; j--) { // console.log(i);5 4 3 2 1 0各六遍 ...

一只白猫罢了 828

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

js setTimeout和for循环搭配使用时变量的问题

最近在写一个定时打字的效果,需要for循环和setTimeout搭配使用,出现了一些问题,在网上查找找到了问题所在。 1.setTimeout(func,time)函数运行机制 setTimeout(func,time)是在time(毫秒单位)时间后执行func函数。浏览器引擎按顺序执行程序,遇到setTimeout会将func函数放到执行队列中,等到主程序执行完毕之后,才开始从执行队...

BQL_Email的专栏 259

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

关于JS中for循环时,作用域问题和this指针指向的总结

在大多数计算机语言中,{}这样一对花括弧叫一个块级作用域,也就是一个执行环境。在一个执行环境中,执行环境内部的变量在作用域外部式无法被访问到的。执行环境内部倒是可以访问外部的变量。 但由于JS中没有块级作用域,只有函数作用域。所以类似于像for(;;){  }这样的作用域,实际上它还是在它的上层作用域之内,如果它上层作用域是global或window,那么实际上这个for循环还是在全局作用域下。

Ekida的博客 3699

php for循环删除元素,JavaScript中关于for循环删除数组元素内容时出现的问题

昨天用for循环进行数组去重的时候出现的问题,首先,用双重for循环把前一个和所有后面的元素进行比较,如果相等则删除。但是,如果数组里面有三个以上连续相等的元素的时候,就会出现问题。var arr = [1,1,1,2,2];for(var i=0; ifor(var j=i+1; jif(arr[i] === arr[j]){arr.splice(j,1);}}}document.write("...

weixin_28867883的博客 202

关于js中for...in循环对象时,输出key值顺序混乱问题

那这个时候,通过线性结构来存储数据,查找肯定的快的,但是如果涉及到大量的修改数据,那么动一发而牵全身,是非常耗性能的,所以数据多了,v8采用了慢排序。循环对象时,顺序为什么会乱?

weixin_52755319的博客 5020

for循环中嵌套异步请求问题

for循环中嵌套了异步请求会导致顺序错乱 简单明了的例子: //for中嵌套异步时,执行顺序会混乱 function forTest(){ for(var i=0; i&lt;5; i++){ (function(j){ setTimeout(function(){ console.log("第"+(j+1)+"次循环"); }, Math.random() * 3...

李静静 2万+

JS中For循环延时

ES6块级作用域 for (let i = 0; i < 10; i++) { setTimeout(() => { console.log(i); }, 1000*i) } 2.闭包 for (var i = 0; i < data.length; i++) { (function (a) { setTimeou...

没有了糖的可乐 7577

c语言for循环加法,BigDecimal 在for循环中相加注意事项

public static void main(String[] args) { BigDecimal bigDecimal = new BigDecimal(1); for (int i = 0; i < 50; i++){ bigDecimal.add(new BigDecimal(i)); } System.out.println(bigDecimal); } 上面这段代码,biDec...

weixin_29469195的博客 1479

Javascript用for in循环迭代 对象(Map) 属性时顺序问题!

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34071713的博客 1161
上一篇: 再谈大楼扔鸡蛋的问题
下一篇: 网络爬虫
RayChase
博客等级 码龄20年 71粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值