「譯」forEach循環(huán)中你不知道的3件事

前言

本文925字配椭,閱讀大約需要7分鐘。

總括: forEach循環(huán)中你不知道的3件事溢吻。

自棄者扶不起俺夕,自強者擊不倒裳凸。

正文

你覺得你真的學會用forEach了么贱鄙?

這是我之前對forEach循環(huán)的理解:就是一個普通語義化之后的for循環(huán)牲平,可以被break,continue,return略步。

這篇文章將向你展示forEach中你可能不了解的3件事。

1. return不會停止循環(huán)

你覺得下面的代碼在打印12之后會停止么嫉到?

array = [1, 2, 3, 4];
array.forEach(function (element) {
  console.log(element);

  if (element === 2) 
    return;
  
});
// Output: 1 2 3 4

答案是不會梦湘,上述代碼會正常打印1,2,3,4瞎颗。如果你有Java背景,你也許會很詫異践叠,這怎么可能呢言缤?

原因是我們在forEach函數(shù)中傳了一個回調(diào)函數(shù)嚼蚀,該回調(diào)函數(shù)的行為和普通函數(shù)一樣禁灼,我們return操作其實就是普通函數(shù)中return。所以并不符合我們預(yù)期將forEach循環(huán)打斷轿曙。

MDN官方文檔:

注意: 除了拋出異常以外弄捕,沒有辦法中止或跳出 forEach() 循環(huán)。如果你需要中止或跳出循環(huán)导帝,forEach() 方法不是應(yīng)當使用的工具守谓。

我們將上述代碼改寫:

const array = [1, 2, 3, 4];
const callback = function(element) {
    console.log(element);
    
    if (element === 2) 
      return; // would this make a difference? no.
}
for (let i = 0; i < array.length; i++) {
    callback(array[i]);
}
// Output: 1 2 3 4

這就是上述代碼實際的執(zhí)行思路,return操作只作用于當前的函數(shù)您单,自然不會對for循環(huán)產(chǎn)生影響

2. 不能break

下面的代碼你覺得會被break掉么斋荞?

const array = [1, 2, 3, 4];
array.forEach(function(element) {
  console.log(element);
  
  if (element === 2) 
    break;
});
// Output: Uncaught SyntaxError: Illegal break statement

不會,甚至這行代碼都不會運行虐秦,直接報錯了平酿。

那么這段代碼如何達到我們原本想達到的效果呢?

用普通for循環(huán)就好了:

const array = [1, 2, 3, 4];
for (let i = 0; i < array.length; i++) {
  console.log(array[i]);
  
  if (array[i] === 2) 
    break;
}
// Output: 1 2

3. 不能continue

下面代碼會是跳過2只打印1悦陋、3蜈彼、4嗎?

const array = [1, 2, 3, 4];
array.forEach(function (element) {
  if (element === 2) 
    continue;
  
  console.log(element);
});
// Output: Uncaught SyntaxError: Illegal continue statement: no surrounding iteration statement

同樣不會俺驶,和break一樣幸逆,報錯,這行代碼之后甚至都不會運行暮现。

怎么達到預(yù)期呢?

還是使用普通的for循環(huán)來解決:

for (let i = 0; i < array.length; i++) {
  if (array[i] === 2) 
    continue;
  console.log(array[i]);
}
// Output: 1 3 4

譯者補充

forEach函數(shù)的實際運行原理其實是這樣的还绘,偽代碼如下:

let arr = [1, 2];
arr.forEach(function(ele) {
    console.log(ele);
}); 
// output: 1, 2
// 上面代碼等同于
function func(ele) {
  console.log(ele);
}
for (let i = 0; i < arr.length; i++) {
    func(arr[i])
}
// output: 1, 2

實際上forEach的polyfill實現(xiàn)也是這樣的,在forEach函數(shù)中執(zhí)行一個for循環(huán)栖袋,在for循環(huán)里調(diào)用回調(diào)函數(shù)拍顷。

因此,像下面代碼自然不會符合預(yù)期:

let arr = [1, 2];
let sum = 0;
function add(a) {
    return a;
}
arr.forEach(async function(ele) {
  sum += await add(ele);
});
console.log(sum);
// Output:0

改寫如下:

let arr = [1, 2];
let sum = 0;
function add(a) {
    return a;
}
for (let i = 0; i < arr.length; i++) {
    sum += await add(arr[i]);
}
console.log(sum);
// Output:3

訂閱更多文章可關(guān)注「前端進階學習」栋荸,回復「666」菇怀,獲取一攬子前端技術(shù)書籍

前端進階學習
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凭舶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子爱沟,更是在濱河造成了極大的恐慌帅霜,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呼伸,死亡現(xiàn)場離奇詭異身冀,居然都是意外死亡,警方通過查閱死者的電腦和手機括享,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門搂根,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铃辖,你說我怎么就攤上這事剩愧。” “怎么了娇斩?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵仁卷,是天一觀的道長。 經(jīng)常有香客問我犬第,道長锦积,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任歉嗓,我火速辦了婚禮丰介,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鉴分。我一直安慰自己哮幢,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布冠场。 她就那樣靜靜地躺著家浇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碴裙。 梳的紋絲不亂的頭發(fā)上钢悲,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音舔株,去河邊找鬼莺琳。 笑死,一個胖子當著我的面吹牛载慈,可吹牛的內(nèi)容都是我干的惭等。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼办铡,長吁一口氣:“原來是場噩夢啊……” “哼辞做!你這毒婦竟也來了琳要?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤秤茅,失蹤者是張志新(化名)和其女友劉穎稚补,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體框喳,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡课幕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了五垮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乍惊。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖放仗,靈堂內(nèi)的尸體忽然破棺而出润绎,到底是詐尸還是另有隱情,我是刑警寧澤匙监,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布凡橱,位于F島的核電站,受9級特大地震影響亭姥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜顾稀,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一达罗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧静秆,春花似錦粮揉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至殊橙,卻和暖如春辐宾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膨蛮。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工叠纹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敞葛。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓誉察,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惹谐。 傳聞我的和親對象是個殘疾皇子持偏,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容