JavaScript使用for...in迭代数组分析

选中文字可对指定文章内容进行评论啦,绿色背景文字可以点击查看评论额。

for...in与其说是迭代,更恰当的说法应该是枚举。其目的是用来枚举object对象的属性,包括对象所继承的属性。

有部分人会使用for...in来迭代数组,这是一种误用。

以下对使用for...in迭代数组分析。

问题一

var a = ['a','b'];
a[5] = 'e';
for (var x in a) {
    console.log(x);
}

输出结果:

0
1
5

比较于:

for (var x of a) {
  console.log(x);
}

输出结果:

a
b
undefined
undefined
undefined
e

for...in只会输出设置了值的索引值,而for...of会迭代数组里所有的值。

问题二
在Array的原型上添加方法。

Array.prototype.hello = function () { 
  console.log("say hello");
};

对数组执行for...in 

var a = ['a','b'];
a[5] = 'e';
for (var x in a) {
    console.log(x);
}

输出结果:

0
1
5
hello

for...in也会枚举Array原型添加的方法。

总结

上面的两个问题归根到底for...in是枚举Array的属性,而非数组里的元素。其中arr[x]是使用下标添加属性的一种方式。所有除非是要枚举Array的属性,否则不推荐使用for..in迭代数组元素。迭代数组元素使用for...of。

版权声明:著作权归作者所有。

相关推荐

JavaScript删除数组里重复的元素

JavaScript里有多种方法可以用来对数组元素去重。ES6 SetES6提供了一个Set对象,用它可以很简单便可以对数组元素去重。function uniq(arr) {    return Array.from(new Set(arr)); } filter另外也可以通过filter来对数组元素去重。functi

使用awk分析nginx访问日志access.log的ip

access.log为nginx的访问日志,默认路径在/var/log/nginx/access.log 分析access.log的ip命令如下:awk '{print $1}' access.log |sort|uniq -c|sort -n 命令里使用awk过滤出访问的ip使用sort对ip排序对排序后的ip进行统计,统计每一个ip访

Java源码分析:产生随机数Random与ThreadLocalRandom的区别

Java用于产生随机数的方法主要有两种:java.util.Random和java.util.concurrent.ThreadLocalRandom。Random从Jdk 1.0开始就有了,而ThreadLocalRandom是Jdk1.7才新增的。简单从命名和类所在的包上看,两者的区别在于对并发的支持。RandomRandom是一个伪随机数生成器,它内置了一个种子数seed。获取随机

Rxjs expand的用法分析

Rxjs的expand()函数声明:public expand(project: function(value: T, index: number), concurrent: number, scheduler: Scheduler): Observable expand()会递归调用project函数,project函数把源值映射为一个Observable,每次递归

JIT的分层编译和逃逸分析

JIT到底在Java的运行中发挥了什么作用呢?根据查阅到的资料,一个作用是做分层编译,一个是做对象的逃逸分析。对于循环体中的代码,循环到一定的程度的时候,就会被再次被编译,编程执行速度更加迅速的代码。对于新建的对象,讲过逃逸分析,如果数据不会逃逸,则将数据放在栈上,不再在heap上新建这个对象。这样的好处是:避免了在堆上新建的锁堆导致的资源损耗不需要GC