流程控制
1. 條件判斷
1. if條件語句(側(cè)重范圍判斷)
if (condition) statement1 // 只有一行代碼,省略{}
if (condition) {
statement1
}
if (condition)
statement1 // 只有一行代碼,省略{}
else
statement2 // 只有一行代碼,省略{}
if (condition) {
statement1
} else {
statement2
}
多個else if語句
if (condition1) {
statement1
} else if (condition2) {
statement2
} eles if (condition3) {
statement3
} else {
statement4
}
注意:
- if側(cè)重范圍比較
-
if()或者else if()如果只有單行代碼,可以省略{},但是不推薦省略,避免歧義 - 上面的condition是任何值,如果放在if的()內(nèi),或者else if()內(nèi),則進行隱形轉(zhuǎn)換,遵從布爾值的轉(zhuǎn)換規(guī)則。
2. switch語句(側(cè)重值比較)
switch (expression) {
case value1:
statement1
break;
case value2:
statement2
break;
default:
statement3
}
注意:
- switch側(cè)重值比較,一般是值對比
- expression是
===比較,非==比較 - break語句是可選語句,如果當(dāng)前expression === value,且break省略,則繼續(xù)向下執(zhí)行代碼,直到結(jié)束或者遇到break結(jié)束
2. 循環(huán)語句
1 for循環(huán):前測試循環(huán)語句
使用范圍:知道循環(huán)次數(shù)
for (var i = 0; i < 10; i++) {
console.log(i);
}
// 0 1 2 3 4 5 6 7 8 9
// 上面例子等價于下面寫法
var i = 0;
for (; i < 10;) {
console.log(i);
i++;
}
2 while循環(huán):前測試循環(huán)語句
使用范圍:不知道循環(huán)次數(shù)
var i = 0;
while (i < 10) {
console.log(i);
i++;
}
// 0 1 2 3 4 5 6 7 8 9
// 此處是expression是表達式,不一定非得是i< 10類似的數(shù)字比較
while (expression) {
statement;
}
注意:使用了while不斷循環(huán)字符串
3 do...while循環(huán):后測試循環(huán)語句
常用于循環(huán)體中的代碼至少要被執(zhí)行一次的情形。
var i = 0;
do {
console.log(i);
i++;
} while (i < 10);
// 0 1 2 3 4 5 6 7 8 9 10
4. for…in語句
for (var property in express) statement
var obj = { name: 'Modeest', age: 18, sex: 'boy' };
for (var property in obj) {
console.log(property, obj[property]);
}
// name Modeest
// age 18
// sex boy
注意:
- 枚舉對象(包括數(shù)組)的可枚舉的屬性
- 枚舉的屬性順序不可預(yù)測
- 不可使用break,throw,continue等關(guān)鍵字終止迭代
5. for…of語句:
var arr = ['a', 'b', 'c'];
for (var val of arr) {
console.log(val);
}
// a b c
注意:
- 遍歷可迭代對象定義要迭代的數(shù)據(jù)
- 迭代(Array,Map,Set,String,TypeArray,arguments等)
- 可以由break,throw,continue,return(結(jié)合函數(shù))終止
for...in和for...of的區(qū)別:
Object.prototype.objCustom = function() {};
Array.prototype.arrCustom = function() {};
let iterable = [3, 5, 7];
iterable.foo = 'hello';
// 迭代以原始插入順序迭代對象的可枚舉屬性
for (let i in iterable) {
console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom"
}
for (let i in iterable) {
if (iterable.hasOwnProperty(i)) {
console.log(i); // logs 0, 1, 2, "foo"
}
}
// 遍歷可迭代對象定義要迭代的數(shù)據(jù)
for (let i of iterable) {
console.log(i); // logs 3, 5, 7
}
6. forEach語句:迭代Array
var arr = ['a', 'b', 'c'];
arr.forEach(function (val, key) {
console.log(val, key);
})
// a 0
// b 1
// c 2
3. 其他關(guān)鍵字
1. break:立即退出循環(huán)
// break:終止循環(huán)
for (var i = 0; i < 10; i++) {
if (i == 4) {
break;
}
console.log(i);
}
// 最終的結(jié)果是:0 1 2 3
2. continue:立即退出當(dāng)前循環(huán),繼續(xù)下次循環(huán)
// 跳過當(dāng)前循環(huán)繼續(xù)執(zhí)行下一次的循環(huán)
for (var i = 0; i < 10; i++) {
if (i == 4) {
continue;
}
console.log(i);
}
// 最終的結(jié)果是:0 1 2 3 5 6 7 8 9
3. label
- 正常循環(huán)打印結(jié)果
for (i = 0; i < 5; i++){
for (j = 10; j < 15; j++){
if (j + i > 16) {
console.log(j, i);
}
}
}
// 結(jié)果
// 14 3
// 13 4
// 14 4
- 帶標記的continue
// 一個標識符(符合標識符定義)
first:
for (i = 0; i < 5; i++){
for (j = 10; j < 15; j++){
if (j + i > 16) {
console.log(j, i);
// 返回標識符的位置
continue first;
}
}
}
// 結(jié)果:
// 14 3
// 13 4
- 帶標記的break
// 一個標識符(符合標識符定義)
first:
for (i = 0; i < 5; i++){
for (j = 10; j < 15; j++){
if (j + i > 16) {
console.log(j, i);
// 返回標識符的位置
break first;
}
}
}
// 結(jié)果:14 3