循環(huán)跳出(對(duì)象,數(shù)組)

這是目錄,簡(jiǎn)書不支持 [TOC] 所以用圖片來代替

Screenshot from 2018-06-25 23-41-29.png

全局測(cè)試數(shù)組和對(duì)象

循環(huán)無外乎用于數(shù)組或者對(duì)象中,數(shù)組對(duì)象也是一個(gè)數(shù)組這里用最簡(jiǎn)單的數(shù)組來代替。
 const arr = [
    [{ key: 'key1', name: 'name1' }, { title: "111", 'otherName': "豬八戒" }],
    [{ key: 'key2', name: 'name2' }, { title: "222", 'otherName': "孫悟空" }],
    [{ key: 'key3', name: 'name3' }, { title: "333", 'otherName': "沙僧" }],
    [{ key: 'key4', name: 'name4' }, { title: "444", 'otherName': "唐僧" }],
    [{ key: 'key5', name: 'name5' }, { title: "555", 'otherName': "小白龍" }],
  ];
const obj = {
    name: 'mine',
    age: 28,
    gender: male,
    name1: 'mine1',
    age1: '30',
    gender: 'female',
}
const obj2 = {
      a: {
        name: 'mine1',
        age: 28,
        gender: 'male',
      },
      b: {
        name2: 'mine2',
        age2: 30,
        gender2: 'male2',
      },
      c: {
        name3: 'mine3',
        age3: 31,
        gender3: 'male3',
      },
    };

forEach的注意事項(xiàng)

注意: 沒有辦法中止或者跳出 forEach 循環(huán),除了拋出一個(gè)異常。如果你需要這樣,使用forEach()方法是錯(cuò)誤的,你可以用一個(gè)簡(jiǎn)單的循環(huán)作為替代。如果您正在測(cè)試一個(gè)數(shù)組里的元素是否符合某條件,且需要返回一個(gè)布爾值,那么可使用 Array.every 或 Array.some。如果可用,新方法 find() 或者findIndex() 也可被用于真值測(cè)試的提早終止。(摘自MDN

break

注意:break只能用在循環(huán)或者switch中
數(shù)組循環(huán):

forEach中用break

arr.forEach((outerItem,outerIndex)=>{
    outerItem.forEach((innerItem,innerIndex)=>{
        if(innerItem.key==="key3"){
        break;
        }
        console.log(outerIndex);
        })
    })

結(jié)果報(bào)錯(cuò),因?yàn)槲覝y(cè)試代碼中開啟了eslint
如果直接在控制臺(tái)中運(yùn)行,報(bào)錯(cuò)。
Uncaught SyntaxError: Unexpected end of input
結(jié)論:foreach中不能用break

for循環(huán)中用break

for (let i = 0; i < 10;i++){
    if (i === 5) {
      break;
    }
    console.log(i);
}

輸出結(jié)果

    0
    1
    2
    3
    4

for循環(huán)中用break是結(jié)束此次循環(huán)

雙層for循環(huán)中內(nèi)層用break

 for (let i = 0; i < 10; i += 1) {
      for (let j = 0; j < 5; j += 1) {
        if (j === 3) {
          break;
        }
        console.log(`當(dāng)前j:${j}`);
      }
      console.log(`當(dāng)前i:${i}`);
 }

輸出結(jié)果

    當(dāng)前j: 0
    當(dāng)前j: 1
    當(dāng)前j: 2
    當(dāng)前i:0
    當(dāng)前j: 0
    當(dāng)前j: 1
    當(dāng)前j: 2
    當(dāng)前i:1
    當(dāng)前j: 0
    當(dāng)前j: 1
    當(dāng)前j: 2
    當(dāng)前i:2
    當(dāng)前j: 0
    當(dāng)前j: 1
    當(dāng)前j: 2
    當(dāng)前i:3
    當(dāng)前j: 0
    當(dāng)前j: 1
    當(dāng)前j: 2
    當(dāng)前i:4
    當(dāng)前j: 0
    當(dāng)前j: 1
    當(dāng)前j: 2
    當(dāng)前i:5
    當(dāng)前j: 0
    當(dāng)前j: 1
    當(dāng)前j: 2
    當(dāng)前i:6
    當(dāng)前j: 0
    當(dāng)前j: 1
    當(dāng)前j: 2
    當(dāng)前i:7
    當(dāng)前j: 0
    當(dāng)前j: 1
    當(dāng)前j: 2
    當(dāng)前i:8
    當(dāng)前j: 0
    當(dāng)前j: 1
    當(dāng)前j: 2
    當(dāng)前i:9

結(jié)論
break用于雙層forEach中是跳出內(nèi)層循環(huán),繼續(xù)外層的下一次循環(huán)

對(duì)象for in 中用break

for (let key in obj) {
      if (key === 'age2') {
        break;
      } else {
        console.log(key);
      }
 }

輸出結(jié)果

    name
    age
    gender
    name2

break對(duì)于對(duì)象是結(jié)束本次循環(huán)

雙層for in 對(duì)象循環(huán)

    for (const outerKey in obj2) {
      if (obj2[outerKey]) {
        for (const innerKey in obj2[outerKey]) {
          if (innerKey === 'age2') {
            break;
          } 
           console.log(innerKey);
        }
        console.log(outerKey);
      }
    }

輸出結(jié)果

    name;
    age;
    gender;
    a;
    name2;
    b;
    name3;
    age3;
    gender3;
    c;

結(jié)論:對(duì)于雙層for in 循環(huán),break也是跳出本層循環(huán),進(jìn)行下一次外層循環(huán)

continue

概述: continue 語句結(jié)束當(dāng)前(或標(biāo)簽)的循環(huán)語句的本次迭代,并繼續(xù)執(zhí)行循環(huán)的下一次迭代。
注意:
與 break 語句的區(qū)別在于, continue 并不會(huì)終止循環(huán)的迭代,而是:
在 while 循環(huán)中,控制流跳轉(zhuǎn)回條件判斷;
在 for 循環(huán)中,控制流跳轉(zhuǎn)到更新語句。
continue 語句可以包含一個(gè)可選的標(biāo)號(hào)以控制程序跳轉(zhuǎn)到指定循環(huán)的下一次迭代,而非當(dāng)前循環(huán)。此時(shí)要求 continue 語句在對(duì)應(yīng)的循環(huán)內(nèi)部。(摘自MDN)

forEach中用continue

arr.forEach((outerItem,outerIndex)=>{
    outerItem.forEach((innerItem,innerIndex)=>{
        if(innerItem.key==="key3"){
        continue;
        }
        console.log(outerIndex);
        })
    })

這次是直接在新建了html文件直接運(yùn)行在chrome文件下,(去掉或者注釋continue就會(huì)正常運(yùn)行)
index.html:47 Uncaught SyntaxError: Illegal continue statement: no surrounding iteration statement
at Array.forEach (<anonymous>)
at index.html:47

結(jié)論:forEach中不能使用continue

for循環(huán)中用continue

for (let i = 0; i < 10;i++){
    if (i === 5) {
      continue;
    }
    console.log(i);
}

輸出結(jié)果

    0
    1
    2
    3
    4
    6
    7
    8
    9

沒有打印出5
結(jié)論:直接結(jié)束當(dāng)前一步,進(jìn)入當(dāng)前循環(huán)的下一步
continue

雙層for循環(huán)中內(nèi)層用continue

 for (let i = 0; i < 10; i += 1) {
      for (let j = 0; j < 5; j += 1) {
        if (j === 5) {
          continue;
        }
        console.log(`當(dāng)前j:${j}`);
      }
      console.log(`當(dāng)前i:${i}`);
 }

輸出

  當(dāng)前j: 0
  當(dāng)前j: 1
  當(dāng)前j: 2
  當(dāng)前j: 4
  當(dāng)前i:0
  當(dāng)前j: 0
  當(dāng)前j: 1
  當(dāng)前j: 2
  當(dāng)前j: 4
  當(dāng)前i:1
  當(dāng)前j: 0
  當(dāng)前j: 1
  當(dāng)前j: 2
  當(dāng)前j: 4
  當(dāng)前i:2
  當(dāng)前j: 0
  當(dāng)前j: 1
  當(dāng)前j: 2
  當(dāng)前j: 4
  當(dāng)前i:3
  當(dāng)前j: 0
  當(dāng)前j: 1
  當(dāng)前j: 2
  當(dāng)前j: 4
  當(dāng)前j: 0
  當(dāng)前j: 1
  當(dāng)前j: 2
  當(dāng)前i:5
  當(dāng)前j: 0
  當(dāng)前j: 1
  當(dāng)前j: 2
  當(dāng)前j: 4
  當(dāng)前i:6
  當(dāng)前j: 0
  當(dāng)前j: 1
  當(dāng)前j: 2
  當(dāng)前j: 4
  當(dāng)前i:7
  當(dāng)前j: 0
  當(dāng)前j: 1
  當(dāng)前j: 2
  當(dāng)前j: 4
  當(dāng)前i:8
  當(dāng)前j: 0
  當(dāng)前j: 1
  當(dāng)前j: 2
  當(dāng)前j: 4
  當(dāng)前i:9

發(fā)現(xiàn)當(dāng)走入if判斷時(shí)候,沒有走入continue下面的 console.log(當(dāng)前j:${j});,走了循環(huán)外面的 console.log(當(dāng)前i:${i});, 但是接著又走了下一次的循環(huán)(內(nèi)部),
跳出當(dāng)前循環(huán)的當(dāng)前步驟(不執(zhí)行后面的代碼),進(jìn)入當(dāng)前循環(huán)的下一個(gè)步驟

對(duì)象for in 中用break

for (let i = 0; i < 10;i++){
    if (i === 5) {
      continue;
    }
    console.log(i);
}

輸出

    0
    1
    2
    3
    4
    6
    7
    8
    9

發(fā)現(xiàn)沒有輸出5
同樣的是立即結(jié)束當(dāng)前步驟,進(jìn)入當(dāng)前循環(huán)的下一步

雙層for in 對(duì)象循環(huán)

    for (const outerKey in obj2) {
      if (obj2[outerKey]) {
        for (const innerKey in obj2[outerKey]) {
          if (innerKey === 'age2') {
            continue;
          } 
           console.log(innerKey);
        }
        console.log(outerKey);
      }
    }

輸出結(jié)果

    name
    age
    gender
    a
    name2
    b
    name3
    age3
    gender3
    c

同樣的顯而易見是一樣的效果同上

return

return語句終止函數(shù)的執(zhí)行,并返回一個(gè)指定的值給函數(shù)調(diào)用者。
描述:
當(dāng)在函數(shù)體中使用return語句時(shí),函數(shù)將會(huì)停止執(zhí)行。如果指定一個(gè)值,則這個(gè)值返回給函數(shù)調(diào)用者。例如,以下函數(shù)返回其>參數(shù)x的平方,其中x是數(shù)字。

forEach中用return

arr.forEach((outerItem,outerIndex)=>{
    outerItem.forEach((innerItem,innerIndex)=>{
        if(innerItem.key==="key3"){
            return false;
        }
        console.log(outerIndex);
        })
    })
arr.forEach((outerItem,outerIndex)=>{
    outerItem.forEach((innerItem,innerIndex)=>{
        if(innerItem.key==="key3"){
        return true;
        }
        console.log(outerIndex);
        })
    })

輸出結(jié)果

    0
    0
    1
    1
    2
    3
    3
    4
    4

上面兩個(gè)表達(dá)式輸出結(jié)果是一致的,所以可以總結(jié)為
結(jié)束當(dāng)前步驟進(jìn)入當(dāng)前循環(huán)的下一步,與continue類似

for循環(huán)中用return

for (let i = 0; i < 10;i++){
    if (i === 5) {
      return;
    }
    console.log(i);
}

輸出結(jié)果

    Uncaught SyntaxError: Illegal return statement

for 循環(huán)中不能用return

雙層for循環(huán)中內(nèi)層用return

 for (let i = 0; i < 10; i += 1) {
      for (let j = 0; j < 5; j += 1) {
        if (i === 5) {
          return;
        }
        console.log(`當(dāng)前j:${j}`);
      }
      console.log(`當(dāng)前i:${i}`);
 }

同樣的報(bào)錯(cuò) Uncaught SyntaxError: Illegal return statement

對(duì)象for in 中用return

for (let i = 0; i < 10;i++){
    if (i === 5) {
      return;
    }
    console.log(i);
}

報(bào)錯(cuò) Uncaught SyntaxError: Illegal return statement

雙層for in 對(duì)象循環(huán)使用return

同上,雙層的也會(huì)報(bào)錯(cuò) Uncaught SyntaxError: Illegal return statemen、

總結(jié)

break

(1).結(jié)束當(dāng)前整個(gè)循環(huán),執(zhí)行當(dāng)前循環(huán)下邊的語句。忽略循環(huán)體中任何其它語句和循環(huán)條件測(cè)試。
(2).只能跳出一層循環(huán),如果你的循環(huán)是嵌套循環(huán),那么你需要按照你嵌套的層次,逐步使用break來跳出。[逐層判斷,逐步跳出]
(3).break在循環(huán)體內(nèi),強(qiáng)行結(jié)束循環(huán)的執(zhí)行,也就是結(jié)束整個(gè)循環(huán)過程,不在判斷執(zhí)行循環(huán)的條件是否成立,直接轉(zhuǎn)向循環(huán)語句下面的語句。
(4).當(dāng)break出現(xiàn)在循環(huán)體中的switch語句體內(nèi)時(shí),其作用只是跳出該switch語句體。
總的來說:就近原則,結(jié)束當(dāng)前的整個(gè)循環(huán)。

continue

(1).終止本次循環(huán)的執(zhí)行,即跳過當(dāng)前這次循環(huán)中continue語句后尚未執(zhí)行的語句,接著進(jìn)行下一次循環(huán)條件的判斷。
(2).結(jié)束當(dāng)前循環(huán),進(jìn)行下一次的循環(huán)判斷。
(3).終止當(dāng)前的循環(huán)過程,但他并不跳出循環(huán),而是繼續(xù)往下判斷循環(huán)條件執(zhí)行語句.他只能結(jié)束循環(huán)中的一次過程,但不能終止循環(huán)繼續(xù)進(jìn)行.

return:

(1).return 從當(dāng)前的方法中退出,返回到該調(diào)用的方法的語句處,繼續(xù)執(zhí)行。
(2).return 返回一個(gè)值給調(diào)用該方法的語句,返回值的數(shù)據(jù)類型必須與方法的聲明中的返回值的類型一致。
(3). return后面也可以不帶參數(shù),不帶參數(shù)就是返回空,其實(shí)主要目的就是用于想中斷函數(shù)執(zhí)行,返回調(diào)用函數(shù)處。

forEach循環(huán)

中使用break, continue均報(bào)錯(cuò)
使用return 就會(huì)結(jié)束當(dāng)前步驟,進(jìn)入當(dāng)前循環(huán)的下一步

for 循環(huán)

中使用break就會(huì)結(jié)束當(dāng)前循環(huán)
使用continue就是結(jié)束當(dāng)前步驟,進(jìn)入當(dāng)前循環(huán)的下一步
使用return 就會(huì)報(bào)錯(cuò)

雙層for循環(huán)

中使用break跳出當(dāng)前循環(huán)進(jìn)入外層循環(huán)
使用continue結(jié)束當(dāng)前步驟,進(jìn)入當(dāng)前循環(huán)的下一步
使用return 就會(huì)報(bào)錯(cuò)

for in循環(huán)

使用break就是結(jié)束當(dāng)前循環(huán)
結(jié)束當(dāng)前步,進(jìn)入當(dāng)前循環(huán)的下一步
使用return 報(bào)錯(cuò)

雙層for in 循環(huán)

使用break就是結(jié)束當(dāng)前循環(huán),直接進(jìn)行外層的下一次循環(huán)
結(jié)束當(dāng)前步驟,進(jìn)入當(dāng)前循環(huán)的下一次循環(huán)
使用return 就會(huì)報(bào)錯(cuò)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,195評(píng)論 0 13
  • 在C語言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,402評(píng)論 0 2
  • 一直思考著是不是要寫出來自己運(yùn)用原始點(diǎn)醫(yī)學(xué)的經(jīng)歷,雖然這些年為了打消一些有緣人的疑慮,增加他們...
    健康的慧心閱讀 1,981評(píng)論 0 5
  • 原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)自:Try_Try_Try 1.獲取Dispatch Queue 的兩種方法 方法一: 通...
    MrOreo閱讀 149評(píng)論 0 0
  • 孤獨(dú)與成長 難舍難分 想要成長 必須 經(jīng)歷孤獨(dú) 經(jīng)歷過心如刀割 才能明白心中所要 蛻變 不是一朝一夕 揭開一層層傷...
    牛奶果子閱讀 342評(píng)論 0 1