我采访了一个自称是高级前端,精通JS,精通VUE,工作了6年的人。 我们也不玩假设,让他感受面试制造火箭,工作搞砸
,然后是真实的东西。
问1:你知道JS有什么方法可以实现数组遍历吗?
答1:for、for in、for of、foreach、map 等,无论如何都可以用来遍历”。
问2:那么这些方法可以中断哪些呢?
答2:好像 for can't,好像 for in 可以,..
语无伦次,陷入沉思。
来吧,女士们,先生们,如果你不知道,那么你可以阅读这篇文章收藏夹 + 喜欢
鼓励挥手。
forfor/infor/ofarray.foreacharray.maparray.reducearray.filterarray.somearray.每种方法都不会一一唠叨,这里是关键点。
重要提示:for in 以任意顺序遍历对象的可枚举属性(符号除外)。 因此,for in 通常用于遍历对象。 for of 在可迭代对象(包括array
map
set
string
typedarray
、参数、对象等),调用自定义迭代钩子,并为每个不同属性的值执行语句。因此,for of 通常用于遍历数组。 注意:
对于in是无序的,需要注意遍历的使用,参考:js puzzle-object中的key是有序的吗?什么可枚举
?仔细看看: 可枚举的突出显示示例:
两者都要遍历对象 let obj = ;// for/infor (var o in obj) ;// output// id// name// for/offor (var o of obj) ;Error 对象不是迭代器,不能用于 VM319:1 Uncaught TypeError: Obj is not iterable正如你所看到的,因为不能遍历一个对象。
两者都遍历数组 let ary = ['a', 'b', 'c'];注意:数组也是一个特殊的对象,我添加了一个属性aryname = 'james'; // for/infor (var o in ary) ;输出打印数组索引和 Name 属性的值(注意)!// 0// 1// 2// james// for/offor (var o of ary) ;输出仅打印每个元素 a、b、c 的数组所以
for/of
ES6的出现也在一定程度上得到了补偿for/in
遍历数组中的缺陷。
重要提示:创建一个新数组(不要忘记将map
将结果分配给遍历,否则将浪费遍历)原始数组不受影响(除非您将map
什么时候foreach
使用,直接在循环中修改原始数组的值)新数组的每个结果都是 ** 函数中返回的值(如果你的 ** 函数忘记了)。reture
新数组的每个元素都是undefined
典型错误案例:
放map
用于遍历数组,map
,直接修改原数组的值
错误示例:
let demoary = [,demoary.map(item => )console.log(demoary);正确示例:
let demoary = [, 方法一:foreach 遍历数组 demoaryforeach(item => )console.log(demoary);方法二:map生成一个新数组来替换原来的数组demoary = demoarymap(item => )console.log(demoary);要点:
生成新结果,结果取决于 ** 函数return
原始数组的值不受影响(除非你把它reduce
什么时候foreach
使用,直接在循环中修改原始数组的值)来接收 2 个参数,callback跟initialvaluecallback有 4 个参数:累计值
当前值
当前指数
原始值
,一般使用前2个参数initialvalue或者,如果省略默认的第一个元素,但如果数组也是空的,则将收到一个错误,其中包含重要示例:
有初始值 [1, 2, 3, 4, 5]。reduce((acc, cur) => ,100);输出迭代 5 次,最后返回 115 100 1 101 2 103 3 106 4 110 5 115 的整数和如果没有初始值,遍历将少 1,因为数组的第一个结果充当迭代器的第一个值。
没有初始值 [1, 2, 3, 4, 5]。reduce((acc, cur) => ) 输出迭代 4 次,最后返回 15 1 2 3 3 6 4 10 5 15 的 int 和结果两者都用于确定数组中是否存在满足条件的元素,并返回结果
true
orfalse
重要提示:同时使用这两种方法时,必须明确何时使用它们return true or false
确定结果
亮点示例:
// some[1, 2, 3, 4, 5].some(item => ;默认值为 false,可以省略。 这意味着它找不到,它将继续遍历并找到数组的最后一个返回值 false;}) 输出迭代 3 次,找到结果并返回 true 1 2 3 true
// every[1, 2, 3, 4, 5].every(item => ;默认值为 false,必须写入。 如果没有明确说明这个时间是真的,说明第一个元素不合适,会直接退出。 return true;}) 输出迭代 3 次,发现不合适的结果并返回 false 1 2 3 false我们先来看看如何破解数组遍历:
BreakThrowReturnContinue(立即结束此循环,**不执行后继续,进入下一轮循环,认为中止当前循环,几乎不计入) forfor ofarraysomearray.我们想要的这些方法中的每一种:中断
数组的常用方法是array.some
跟array.every
,因为在中断数组遍历之前必须满足某些条件,对吧?使用这两种句法糖可能更合适。
// for breaklet ary = [1, 2, 3, 4, 5];for (let i=0; i< ary.length; i++)// output// 0// 1// 2// 3// --// for continuefor (let i=0; i< ary.length; i++)console.log('after=', i);} 输出 请注意,没有 after=3 before= 0 after= 0 before= 1 after= 1 before= 2 after= 2 before= 3 before= 4 after= 4 after= 4
// for/of breaklet ary = [1, 2, 3, 4, 5];for (let o of ary) ;// output// 1// 2// 3// --// for/of continuefor (let o of ary) ;console.log('after=', o);} 输出 请注意,没有 after=3 before= 1 after= 1 before= 2 after= 2 after= 2 before= 3 before= 4 after= 4 before= 5 after= 5 after= 5参考上面的用法,不再重复。
这两种方法与以下方面有关:for
跟for/of
需要注意的区别在于它们破坏了语法return
它不能使用break
或continue