我採訪了乙個自稱是高階前端,精通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