這是目錄,簡(jiǎn)書不支持 [TOC] 所以用圖片來代替
全局測(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ò)