流程控制
1. 条件判断
1. if条件语句(侧重范围判断)
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侧重范围比较
-
if()
或者else if()
如果只有单行代码,可以省略{}
,但是不推荐省略,避免歧义 - 上面的condition是任何值,如果放在if的()内,或者else if()内,则进行隐形转换,遵从布尔值的转换规则。
2. switch语句(侧重值比较)
switch (expression) {
case value1:
statement1
break;
case value2:
statement2
break;
default:
statement3
}
注意:
- switch侧重值比较,一般是值对比
- expression是
===
比较,非==
比较 - break语句是可选语句,如果当前expression === value,且break省略,则继续向下执行代码,直到结束或者遇到break结束
2. 循环语句
1 for循环:前测试循环语句
使用范围:知道循环次数
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循环:前测试循环语句
使用范围:不知道循环次数
var i = 0;
while (i < 10) {
console.log(i);
i++;
}
// 0 1 2 3 4 5 6 7 8 9
// 此处是expression是表达式,不一定非得是i< 10类似的数字比较
while (expression) {
statement;
}
注意:使用了while不断循环字符串
3 do...while循环:后测试循环语句
常用于循环体中的代码至少要被执行一次的情形。
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
注意:
- 枚举对象(包括数组)的可枚举的属性
- 枚举的属性顺序不可预测
- 不可使用break,throw,continue等关键字终止迭代
5. for…of语句:
var arr = ['a', 'b', 'c'];
for (var val of arr) {
console.log(val);
}
// a b c
注意:
- 遍历可迭代对象定义要迭代的数据
- 迭代(Array,Map,Set,String,TypeArray,arguments等)
- 可以由break,throw,continue,return(结合函数)终止
for...in
和for...of
的区别:
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"
}
}
// 遍历可迭代对象定义要迭代的数据
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. 其他关键字
1. break:立即退出循环
// break:终止循环
for (var i = 0; i < 10; i++) {
if (i == 4) {
break;
}
console.log(i);
}
// 最终的结果是:0 1 2 3
2. continue:立即退出当前循环,继续下次循环
// 跳过当前循环继续执行下一次的循环
for (var i = 0; i < 10; i++) {
if (i == 4) {
continue;
}
console.log(i);
}
// 最终的结果是:0 1 2 3 5 6 7 8 9
3. label
- 正常循环打印结果
for (i = 0; i < 5; i++){
for (j = 10; j < 15; j++){
if (j + i > 16) {
console.log(j, i);
}
}
}
// 结果
// 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;
}
}
}
// 结果:
// 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;
}
}
}
// 结果:14 3