【面试】for...of和for的区别

133 阅读2分钟

简介

  • for循环是 javascript 早期提供的遍历方式之一,主要遍历数组字符串
    for(let i=0; i<5; i++) {
        console.log('第'+i+'个')
    }
  • for...of 是 es6 提供的遍历方式,主要遍历数组字符串
    const arr = ['a','b','c','d','e']
    for(let item of arr) {
        console.log(item)
    }

差异

for循环for...of
continue continue
break break
有下标 有下标
能拿到遍历元素 能拿到遍历元素
es5(且支持ie) es5(且不支持ie)
遍历Map和Set 遍历Map和Set
类数组对象 类数组对象
arguments arguments
  • for循环是javascript原生能力,还是很强大的,美中不足的是能不拿到遍历元素且不支持最新的Map和Set遍历

  • for...of循环也炒鸡强大,但存在兼容问题和不能遍历普通对象的问题。

    for...of为啥可以遍历Map和Set?真的不能遍历普通对象嘛?

遍历器Iterator

遍历器(Iterator)是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)

Iterator 的作用有三个:一是为各种数据结构,提供一个统一的、简便的访问接口;二是使得数据结构的成员能够按某种次序排列;三是 ES6 创造了一种新的遍历命令for...of循环,Iterator 接口主要供for...of消费。

具体不细讲,可参考MDN文章或阮一峰大佬的文章

可以下结论,for...of能遍历的对象上都存在遍历器

例如: 只要某个数据结构部署了 Iterator 接口,就可以对它使用扩展运算符,将其转为数组。

let arr = [...iterable]; // iterable可以NodeList、arguments等等

例如: 根据遍历器知识,那么以类数组对象为例:

var it = {'0':1, '1':2, length:2};
it[Symbol.iterator] = makeIterator

function makeIterator() {
  var nextIndex = 0;
  var self = this;
  return {
    next: function() {
      return nextIndex < self.length ?
        { value: self[nextIndex++], done: false } :
        { value: undefined, done: true };
    }
  };
}

for(let i of it){console.log(i)} //1 //2

总结

回到正题上,面试官到底想问什么,表面问for循环和for...of的差异,实际在问for...of遍历的本质--靠的是es6的迭代器Iterator(遍历器)。

这里简单归纳了一下javascript的可迭代对象,结果如下

可迭代对象(11种?): Array String Map WeakMap Set WeakSet arguments TypedArray Generator NodeList 和 类数组对象

文中如有错误,欢迎在评论区指正