JavaScript中for...in循环使用问题

问题

使用for...in去遍历一个数组,同时将值添加到另外一个数组时,新的数组中每次都多出来一个function类型的元素。

原因及解决方案

for...in用来循环本身没有问题,但是经常被误用来遍历数组或者类似数据的对象。

for...in的本意是用来遍历对象的属性,这就会导致遍历时上升到原型链的层次,不仅会遍历自身的属性,还会遍历继承获得的属性,然而有时这是不需要的。

另外,即使确定要遍历的数组没有继承属性,在使用for...in进行遍历时,并不能保证获取的元素顺序和数组中原始顺序一致。

例如在JScript (IE <= 8)中,遍历数组的顺序是元素加入数组的顺序

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对象,这个扩展属性也会被遍历出来

Array.prototype.last = function () { return this[this.length-1]; }; for (var p in []) { // an empty array // last will be enumerated }

使用for...in遍历一个对象的属性时,如果只想遍历对象本身的属性,那么可以使用hasOwnProperty方法进行判断

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

如果要遍历一个数组或者一个类似数组的对象,最好是使用一个顺序循环,例如一个普通的for/while循环,也可以使用ES6中的for...of循环。

for...of循环例子:

//循环一个数组 let iterable = [10, 20, 30]; for (let value of iterable) { console.log(value); } //循环一个字符串 let iterable = "boo"; for (let value of iterable) { console.log(value); } //循环一个map let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]); for (let [key, value] of iterable) { console.log(value); } //或者 for (let entry of iterable) { console.log(entry); } //循环一个拥有enumerable属性的对象 for (var key of Object.keys(someObject)) { console.log(key + ": " + someObject[key]); }

__EOF__

本文作者一步一年
本文链接https://www.cnblogs.com/ybyn/p/13924279.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:编写不易,转载请注明出处
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   一步一年  阅读(584)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示