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

for...in

  遍历对象的可枚举属性列表(包括 [[Prototype]] 链)。

  注意:

  1. 遍历对象是无法直接获取属性值的,需要手动获取属性值   =>  因为遍历的是对象中的所有可枚举属性。

  2. for...in 最好只应用在对象上   =>  遍历数组,有时会产生出人意料的结果。因为枚举属性可能不仅包含所有数值下标,还可能包含其他可枚举属性。

for...of

  一般用来直接遍历数组。 =>  直接遍历值。

  注意:

  1. 不能直接用来遍历对象。(并不是说 for...of 不能用来遍历对象,只要能寻找到对象中内置或者自定义的 @@iterator对象并可以调用它的next()方法。)  =>   因为 数组有内置的 @@iterator, 而普通的对象没有内置的 @@iterator。所以无法自动完成 for...of 遍历。    // 此处的 @ 用来代替,那个特殊符号打不出

  for...of 循环首先会向被访问对象请求一个迭代器对象。然后通过调用迭代器对象的 next() 方法来遍历所有返回值。

  比如使用内置的@@iterator,手动遍历数组:     // @@iterator 本身并不是一个迭代器对象,而是一个返回迭代器对象的函数。

var arr = [1, 2, 3];
var it = arr[Symbol.iterator](); 
// 通过ES6中的符号 Symbol.iterator 来获取对象的 @@iterator 内部属性

it.next;  // {value: 1, done: false}    value:当前的遍历值, done: 是否还有可遍历的值。 
it.next;  // {value: 2, done: false}
it.next;  // {value: 3, done: false}
it.next;  // {done: true}

   2. 若想遍历对象,可以手动定义 @@iterator。

   3. for...of 循环每次调用 myObject迭代器对象的 next() 方法时,内部的指针都会向前移动并返回对象属性列表的下一个值。

 

posted on 2021-02-26 16:56  bala001  阅读(128)  评论(0编辑  收藏  举报

导航