for...in和for...of的区别

简介: 前言在JavaScript中遍历数组通常是使用for...i循环,在ES5具有遍历数组功能的还有forEach、map、filter、some、every、reduce、reduceRight等。for...in和for...of是两种增强型循环,for...in是ES5标准,在ES6中新增了for...of的循环方式。

1.for...in


for...in可以遍历对象、数组。


遍历数组:

Array.prototype.method=function(){
  console.log(this.length);
}
let arr = [1, 2, 4, 5, 7];
for (let index in arr) {
    console.log(arr[index]);
    console.log(typeof index);
}


结果:3.png


有上段代码可以总结出for...in遍历数组的特点:

  • 遍历的索引为字符串类型
  • 遍历顺序可能不是按照数组顺序(随机顺序)
  • 使用for in会遍历数组所有的可枚举属性,包括原型。


所以for...in更适合遍历对象,不要使用for in遍历数组。


遍历对象:

Object.prototype.method = function () {
    console.log(this);
}
let obj = {
    name: "张三",
    age: 22
}
for (let key in obj) {
    console.log(key);
    console.log(obj[key]);
}


遍历的索引值即key值。4.png


所以从以上来看,for...in更适合用来遍历对象


2.for...of


for-of可以简单、正确地遍历数组(不遍历原型method和name)。


遍历数组:

let myArray = [1, 2, 4, 5, 6, 7];
myArray.name = "数组";
myArray.getName = function () { return this.name; }
for (let value of myArray) {
    console.log(value);
    console.log(typeof value)
}

结果:5.png


从上面输出结果可以看出,使用for...of遍历数组得到了正确的值和索引。


3.JavaScript中可迭代对象


  • Set
  • Map
  • String
  • Array
  • Arguments
  • NodeList


如何判断是否有迭代能力?

Array.prototype.hasOwnProperty(Symbol.iterator)



4.总结


  • for...in可以遍历对象和数组,for...of不能遍历对象
  • for...in 循环不仅遍历数字键名,还会遍历手动添加的其它键,甚至包括原型链上的键
  • for...in遍历的索引为字符串类型
  • for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合,但是不能遍历对象
  • for...of与forEach()不同的是,它可以正确响应break、continue和return语句
  • 具有迭代器对象才可以使用for...of


总结一句话就是遍历数组使用for...of,遍历对象使用for...in。

相关文章
|
29天前
|
存储 C语言 C++
1. 认识C++和C的区别
1. 认识C++和C的区别
44 0
|
3月前
|
索引
for each和for of的区别
for each和for of的区别
19 0
|
8月前
|
算法 Java Unix
C++基础语言之(二)C和C++的区别
C++基础语言之(二)C和C++的区别
|
8月前
|
JavaScript 小程序
bindtap和catchtap的区别?
在微信小程序中,bindtap 和 catchtap 都是用于绑定点击事件的属性,但它们在事件冒泡和事件捕获方面有所不同。
|
8月前
for in 和 for of的区别
for in 和 for of的区别
82 1
|
9月前
#{} 和 ${} 的区别是什么?
#{} 和 ${} 的区别是什么?
36 0
|
9月前
|
存储
逻辑移位与算术移位的区别
用一句简单的话来说就是:逻辑移位不需要考虑符号位,算术移位需要考虑符号位,我们都知道。数在计算机中都是以补码的形式来存储的,这才造成了逻辑移位和算术移位的的差别。
196 0
|
11月前
|
安全 前端开发 Java
WebMvcConfigurationSupport 和 WebMvcConfigurer 区别你知道吗
WebMvcConfigurationSupport 和 WebMvcConfigurer 的使用过程中你是否踩坑了它们的区别是什么快来看看吧
337 0
写出 && 和 & 的区别。
写出 && 和 & 的区别。
71 0