资讯专栏INFORMATION COLUMN

我们不一样:for...of与for...in

Imfan / 2477人阅读

摘要:定义两者都是遍历的方法,最先能想到的区别是,前者是遍历键名,后者是遍历键值。一种数据结构只要部署了接口,就称之为可遍历的。中提供了一些具备原生接口的数据结构包括函数的对象对象。

定义

两者都是遍历的方法,最先能想到的区别是,前者是遍历键名,后者是遍历键值。
看一下两者的定义:

for...in 遍历当前对象的所有可枚举属性(包括自有属性,从原型继承的属性),遍历顺序是无序的

for...of 遍历当前可遍历(iterable)数据结构拥有的可迭代元素(iterator),是有序的,是ES6提供的新方法

那么iterator是什么呢

遍历器 iterator

iterator是一种接口,为不同的数据结构提供统一的访问机制。
iterator主要供for...of消费。
一种数据结构只要部署了iterator接口,就称之为可遍历的。
ES6中提供了一些具备原生iterator接口的数据结构(包括Array、Map、Set、String、TypedArray、函数的arguments对象、NodeList对象。不包括Object),部署在数据结构的Symbol.iterator属性中。
所以也可以说,一种数据结构只要有Symbol.iterator属性,就称之为可遍历的。

</>复制代码

  1. var myIterable = {};
  2. myIterable[Symbol.iterator] = function* () {
  3. yield 1;
  4. yield 2;
  5. yield 3;
  6. };
  7. for (let value of myIterable) {
  8. console.log(value);
  9. }
  10. // 1
  11. // 2
  12. // 3
for...of使用示例

</>复制代码

  1. // 遍历数组
  2. let iterable = [10, 20, 30];
  3. for (let value of iterable) {
  4. value += 1;
  5. console.log(value);
  6. }
  7. // 11
  8. // 21
  9. // 31
  10. // 遍历字符串
  11. let iterable = "boo";
  12. for (let value of iterable) {
  13. console.log(value);
  14. }
  15. // "b"
  16. // "o"
  17. // "o"
  18. // 遍历Map
  19. let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);
  20. for (let entry of iterable) {
  21. console.log(entry);
  22. }
  23. // ["a", 1]
  24. // ["b", 2]
  25. // ["c", 3]
  26. for (let [key, value] of iterable) {
  27. console.log(value);
  28. }
  29. // 1
  30. // 2
  31. // 3
  32. // 遍历arguments
  33. (function() {
  34. for (let argument of arguments) {
  35. console.log(argument);
  36. }
  37. })(1, 2, 3);
  38. // 1
  39. // 2
  40. // 3

如果用中断for...of,可以使用break、continue、throw或return

</>复制代码

  1. function* foo(){
  2. yield 1;
  3. yield 2;
  4. yield 3;
  5. };
  6. for (let o of foo()) {
  7. console.log(o);
  8. break; // 终止iterator,跳出循环
  9. }
for...in使用示例

</>复制代码

  1. // 从原型继承的属性
  2. Object.prototype.objCustom = function() {};
  3. Array.prototype.arrCustom = function() {};
  4. // 自定义属性
  5. let iterable = [3, 5, 7];
  6. iterable.foo = "hello";
  7. for (let i in iterable) {
  8. console.log(i); // 0, 1, 2, "foo", "arrCustom", "objCustom"
  9. }
  10. for (let i in iterable) {
  11. if (iterable.hasOwnProperty(i)) {
  12. console.log(i); // 0, 1, 2, "foo"
  13. }
  14. }
  15. for (let i of iterable) {
  16. console.log(i); // 3, 5, 7
  17. }
参考

ECMAScript 6 入门 - Iterator 和 for...of 循环
developer.mozilla.org - Difference between for...of and for...in

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107696.html

相关文章

  • js遍历之for forEach in of

    摘要:语法参数当前遍历项。遍历的范围在第一次调用前就会确定。已删除的项不会被遍历到。的是由提出的,目的是作为遍历所有数据结构的统一方法。不仅可以遍历数组,还可以遍历结构,某些类似数组的对象如对象对象,对象,以及字符串。 即使是最简单的循环,其中也深藏学问 ECMAScript5(es5)有三种for循环 简单for for in forEach ECMAScript6(es6)新增 fo...

    yeyan1996 评论0 收藏0
  • Iterator 和 for...of 循环

    摘要:和循环遍历器意义为四种数据集合,提供统一的接口机制来处理所有不同的数据结构。调用函数返回一个遍历器对象,代表函数的内部指针。以后,每次调用遍历器对象的方法,就会返回一个有着和两个属性的对象。 Iterator 和 for...of 循环 Iterator(遍历器)意义 为Array、Object、Map、Set四种数据集合,提供统一的接口机制来处理所有不同的数据结构 。 任何数据结构,...

    Drinkey 评论0 收藏0
  • 数组对象、字符串遍历方法大全

    摘要:本文主要收集各种遍历方法,主要针对数组,也会有关于对象字符串的,看完它,你会对遍历有一个新的认识。方法是标准引入的。 当我们需要遍历一个数组时,第一个想到的就是for,然后用length去判断条件,之后++,但着似乎有些过于老套了。本文主要收集各种遍历方法,主要针对数组,也会有关于对象、字符串的,看完它,你会对遍历有一个新的认识。 showImg(https://segmentfaul...

    szysky 评论0 收藏0
  • lodash源码分析之compact中的遍历

    摘要:到这里,源码分析完了。但是,有两个致命的特性的遍历不能保证顺序会遍历所有可枚举属性,包括继承的属性。的遍历顺序依赖于执行环境,不同执行环境的实现方式可能会不一样。 小时候,乡愁是一枚小小的邮票, 我在这头, 母亲在那头。 长大后,乡愁是一张窄窄的船票, 我在这头, 新娘在那头。 后来啊, 乡愁是一方矮矮的坟墓, 我在外头, 母亲在里头。 而现在, 乡愁是一湾浅浅的海峡, 我在这头, 大...

    dmlllll 评论0 收藏0
  • javascript遍历方法总结

    摘要:总之,是用来循环带有字符串的对象的方法。循环里引入了一种新的循环方法,它就是循环,它既比传统的循环简洁,同时弥补了和循环的短板。 forEach 循环 JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.length; index++) { console.log(myAr...

    BothEyes1993 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<