基本概念与for in

循环:语言层面上的语法(如重复执行一段程序的方案)
遍历:业务层面上的做法(观察或者获取几何中的元素的一种做法)
迭代:实现层面上的概念(实现遍历的底层方案是迭代)

for in用于遍历对象的可枚举属性

迭代器iterator与for of

迭代器用于:获取我们 在遍历当中 需要获取的元素
for of 依赖 Symbol.iterator

拥有 symbol.iterator 的有:
Array 、Map、Set、String、TypedArray(类数组如Arguments),都是内置可迭代对象,因为它们的原型对象都拥有一个 Symbol.iterator 方法,而Object则没有,因为对象不可迭代,它是无序的

for in 和 for of 区别

它们都是用来迭代一些东西的,主要区别在于它们的迭代方式不同:
for in 语句以任意顺序迭代对象的可枚举属性
for of 语句遍历可迭代对象定义要迭代的数据
通俗记忆:

  • for in常用于对象,遍历的是key,它也可以用于数组,遍历的是index,但得到的是字符串型的index,不能用于几何运算;
  • for of常用于数组,遍历的是value,不可用于对象,因为for of遍历的是拥有迭代器的集合,它依赖 Symbol.iterator

  • for in 能遍历到原型链上的东西

  • for in 和 for of 都可以遍历 字符串

    for of + entries 脱光对象

    应用场景:针对对象遍历,for in 只能遍历对象的key,for of 只能遍历对象的value,如何两全其美,既遍历key又遍历value?→→使用for of + entries 的组合
    Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组
    res:Array[]
    1. const object1 = {
    2. a: 'somestring',
    3. b: 42
    4. };
    5. for (const [key, value] of Object.entries(object1)) {
    6. console.log(`${key}: ${value}`);
    7. }
    8. // expected output:
    9. // "a: somestring"
    10. // "b: 42"

生成器、迭代器与Symbol.iterator

生成器 generator:用于生成(返回) 一个迭代器

  1. const arr =[1,2,3,4]
  2. function * generator (arr){
  3. for(let value of arr){
  4. yield value //分阶段地产生
  5. }
  6. }
  7. const iterator = generator(arr)
  8. console.log(iterator) // {value: 1, done: false}
  9. console.log(iterator.next().value) //一次只打印一个值

应用场景:异步编程
yield命令式异步任务不同阶段的分界线

两个要点:格式上带*;内部语句使用yield关键字定义不同的状态数据
迭代就是每次执行next函数

数组七种遍历

forEach

没有返回值/返回值为undefined
forEach 对数组的每个元素执行一次给定的函数
不修改原数组 (尽管 callback 函数在被调用时可能会改变原数组)

map

创建并返回一个新数组,由原数组 每个元素执行回调函数后的 结果组成的新数组
map 不修改原数组(当然可以在 callback 执行时改变原数组)

不该使用map的情况:
A)你不打算使用返回的新数组,
B) 你没有从回调函数中返回值。

filter

创建并返回一个新数组, 其包含通过了所提供函数测试的所有元素
通过函数测试即:函数的返回值为 真值
如果没有任何数组元素通过测试,则返回空数组
filter 不修改原数组

  1. function isBigEnough(element) {
  2. return element >= 10;
  3. }
  4. var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);

应用场景:
数组搜索、过滤

reduce

每次回调方法返回的值,都会传递到下次回调中
两个参数:回调的方法(回调形参第一个为累加器,第二个为当前遍历的项);累加器的初始值

reduceRight

some

测试数组中是不是至少有1个元素通过了被提供的函数测试
通过函数测试即:函数的返回值为 真值
它返回的是一个Boolean类型的值

应用场景:
判断数组元素中是否存在某个值

every

测试一个数组内的所有元素是否都能通过某个指定函数的测试
通过函数测试即:函数的返回值为 真值
它返回一个布尔值

注意:若收到一个空数组,此方法在一切情况下都会返回 true

应用场景:
检测所有数组元素的大小

总结

想要一个新数组用map,想要一个结果用reduce,想要一个过滤了的结果用filter