基本概念与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[]
const object1 = {
a: 'somestring',
b: 42
};
for (const [key, value] of Object.entries(object1)) {
console.log(`${key}: ${value}`);
}
// expected output:
// "a: somestring"
// "b: 42"
生成器、迭代器与Symbol.iterator
生成器 generator:用于生成(返回) 一个迭代器
const arr =[1,2,3,4]
function * generator (arr){
for(let value of arr){
yield value //分阶段地产生
}
}
const iterator = generator(arr)
console.log(iterator) // {value: 1, done: false}
console.log(iterator.next().value) //一次只打印一个值
应用场景:异步编程
yield命令式异步任务不同阶段的分界线
两个要点:格式上带*;内部语句使用yield关键字定义不同的状态数据
迭代就是每次执行next函数
数组七种遍历
forEach
没有返回值/返回值为undefined
forEach 对数组的每个元素执行一次给定的函数
不修改原数组 (尽管 callback 函数在被调用时可能会改变原数组)
map
创建并返回一个新数组,由原数组 每个元素执行回调函数后的 结果组成的新数组
map 不修改原数组(当然可以在 callback 执行时改变原数组)
不该使用map的情况:
A)你不打算使用返回的新数组,
B) 你没有从回调函数中返回值。
filter
创建并返回一个新数组, 其包含通过了所提供函数测试的所有元素
通过函数测试即:函数的返回值为 真值
如果没有任何数组元素通过测试,则返回空数组
filter 不修改原数组
function isBigEnough(element) {
return element >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
应用场景:
数组搜索、过滤
reduce
每次回调方法返回的值,都会传递到下次回调中
两个参数:回调的方法(回调形参第一个为累加器,第二个为当前遍历的项);累加器的初始值
reduceRight
some
测试数组中是不是至少有1个元素通过了被提供的函数测试
通过函数测试即:函数的返回值为 真值
它返回的是一个Boolean类型的值
every
测试一个数组内的所有元素是否都能通过某个指定函数的测试
通过函数测试即:函数的返回值为 真值
它返回一个布尔值
注意:若收到一个空数组,此方法在一切情况下都会返回 true
总结
想要一个新数组用map,想要一个结果用reduce,想要一个过滤了的结果用filter