javascript控制语句
原创
©著作权归作者所有:来自51CTO博客作者带着梦想飞翔的原创作品,请联系作者获取转载授权,否则将追究法律责任
javascript控制语句
文章目录
语句块
- JS使用大括号构成语句块。
- ES6 之前语句块是没有作用域的,从ES6开始支持块作用域 ,let只能在块作用域内可见
function hello(){
let a = 1;
var b = 2;
c = 3;
}
//let d = 100
if (1){
let d = 4;
var e = 5;
f = 6;
if (true){
console.log(d);
console.log(e);
console.log(f);
console.log("- ".repeat(10))
g = 10
var h = 11
}
}
// console.log(a); //不可见
// console.log(b); // 不可见
// console.log(c); // 函数没执行,依然不可见
hello()
// console.log(a); //不可见
// console.log(b); // 不可见
console.log(c); // 3
console.log("- ".repeat(40));
// console.log(d) //块作用域使用let,不可见;但是块内的d可见
console.log(e) //块作用域使用var,可见
console.log(f) //块作用域隐式声明,可见
console.log(g) //可见
console.log(h) //可见
流程控制
条件分支
if条件分支
- 语法:
if (条件1){满足条件1执行}else if(条件2){满足条件2执行}else{都不满足条件,就执行} - 条件false的等效值有:
- false
- undefined
- null
- 0
- NaN
- 空字符串""
if (cond1){
}
else if (cond2){
}
else if (cond3){
}
else{
}
switch…case分支语句
- switch…case语句中,如果switch中的值会一个个匹配case中的值,如果匹配到,就进入对应case的语句块。如果然后穿透当前case下面的所有语句块。break会终止穿透。
- switch…case语句都可以写成多分支结构。
- 语法
switch(expression){
case label_1:
statements_1
[break;]
case label_2:
statements_2
[break;]
...
default:
statements_def
[break;]
}
- 这里最大的问题,就是穿透问题,一定要在case中恰当的使用break语句,否则就会继续顺序向下执行。
let x = 5
switch (x){
case 0:
console.log('zero');
break;
case 1:
console.log('one');
case 2:
console.log('two');
case 3:
console.log('three');
break;
case 5:
case 4:
console.log('four or five');
default:
console.log('other');
//break;
}
]
循环语句
for循环
- C风格for循环
for ([initialExpression];[condition];[incrementExpression]){
statement
}
for (let i=0;i<5;i++){
console.log(i)
}
console.log("----------------------------")
for(var x=0,y=9;x<5;x++,y--){
console.log(x,y)
}
console.log("------------------------------")
for(let i=0;i<10;i+=3){//步长
console.log(i)
}
- for…in循环
for (variable in object){
statements
}
- for…in循环返回的是索引或者key,需要间接访问到值。
- 数组反正返回的是索引,C风格for循环操作可能方便点。根据个人喜好选择。
- 对象访问时for in合适
- 示例
let arr = [10,20,30,40]
console.log(arr);
console.log(arr[1]);//20
console.log("- ".repeat(30));
for (let x in arr){
console.log(x,arr[x]);
}
console.log(" -".repeat(20))
//c风格
for (let i=0;i<arr.length;i++){
console.log(i,arr[i])
}
//对象
let obj = {
a:1,
b:'xdd',
c:true
};
console.log(obj);
console.log(obj.b);
console.log(" -".repeat(20))
for (let key in obj){
console.log(key,obj[key]) //属性名,属性值
}
- for…of循环
- ES6的新语法
- 注意:for…of不能迭代一个普通对象。因为是,of后面必须是一个迭代器(TypeError: obj[Symbol.iterator] is not a function)
- 可类比python中的for in,例如for x in []
let arr = [1,2,3,4,5]
let obj = {
a:1,
b:'xdd',
c:true
}
for (let i of arr){ //返回数组的元素
console.log(i)
}
// for (let i of obj){ //异常,不可迭代
// console.log(i)
// }
]
break、continue
- break 结束当前循环
- continue中断当前循环,直接进入下一次循环
for迭代的差别
function sum(arr){
for (let x in arr){ //遍历index或对象属性
console.log(x,typeof(x),arr[x]);
}
for (let x of arr){ //遍历index或对象属性
console.log(x,typeof(x),arr[x]);
}
for(let x=0;x<arr.length;x++){//自己定义索引数字遍历
console.log(x,typeof(x),arr[x]);
}
}
sum([3,6,9])
练习
for (let i=1;i<10;i++){
line = '';
for (let j=1;j<=i;j++){
line += `${j}*${i}=${(j*i>=10 || j==1)?j*i:j*i+" "} `;
}
console.log(line);
}