JavaScript的for...in和for...of

108 阅读2分钟

for...in 和 for...of

宇航员.png

简单来说就是它们两者都可以用于遍历,不过for in遍历的是数组的索引(index),而for of遍历的是数组元素值(value)

// for in
var obj = {a:1, b:2, c:3}
    
for (let key in obj) {
  console.log(key)
}
// a b c//for of
const array1 = ['a', 'b', 'c']
 
for (const val of array1) {
  console.log(val)
}
// a b c

通过上面这个demo可以看到,for in可以用来遍历对象,for of来遍历数组

for in

mdn: for...in语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。

for in更适合遍历对象,当然也可以遍历数组,但是会存在问题 例如:

var arr = [1,2,3]
// 1. 索引为字符串数字,不能直接进行几何运算    
for (let index in arr) {
  let res = index + 1
  console.log(res)
}
//expect result: 01 11 21
// 2. 遍历顺序有可能不是按照实际数组的内部顺序

使用for in会遍历数组所有的可枚举属性,包括原型,如果不想遍历原型方法和属性的话,可以在循环内部判断一下,使用hasOwnProperty()方法可以判断某属性是不是该对象的实例属性

var arr = [1,2,3]
Array.prototype.a = 123
    
for (let index in arr) {
  let res = arr[index]
  console.log(res)
}
//1 2 3 123for(let index in arr) {
    if(arr.hasOwnProperty(index)){
        let res = arr[index]
        console.log(res)
    }
}
// 1 2 3
注意
  • for ... in 不应该用于迭代一个关注索引顺序的数组
  • for ... in是为遍历对象属性而构建的,不建议与数组一起使用,数组可以用Array.prototype.forEach()和for ... of
  • for ... in 更多的是为了调试Object,查看key-value

for of

MDN: for...of语句在可迭代对象(包括 ArrayMapSetStringTypedArrayarguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句

var arr = [1,2,3]
arr.a = 123
Array.prototype.a = 123
    
for (let value of arr) {
  console.log(value)
}
//1 2 3
注意
  • 它是ES6新增的语法
  • 它不能遍历对象,因为对象没有迭代器
  • for of遍历的是数组元素值,而且for of遍历的只是数组内的元素,不包括原型属性和索引

参考文档

for in 和 for of 的区别 - 掘金 (juejin.cn)

for...of - JavaScript | MDN (mozilla.org)

学习笔记,记录一些,如有问题,帮忙指正