《JavaScript高级程序设计》读书笔记(三)基本概念第五小节流程控制语句
内容
---语法
---数据类型 上一小节
---流程控制语句 本小节
---理解函数
语句
--ECMA-262规定了一组语句,也称流程控制语句
if语句
-- 条件可以是任意表达式,
-- ECMAScript会自动调用Boolean()转化结果为一个布尔值
-- 推荐始终使用代码块,即使只有一行代码
if(condition) { statement1; } else if () { statement2; } else { statement3; }
do-while语句
--后测试循环语句
--在对条件表达式求值之前,循环体中的代码至少会被执行一次
do { statement; } while (expression);
while 语句
--前测试循环语句
--在循环体代买执行之前,就会对出口条件求值
while(expression) { statement; }
for 语句
--前侧循环语句
--具有,执行循环之前初始化变量和定义循环后要执行代码的能力
for(initialization; expression; post-loop-expression) { statement; }
--for与while相同,while循环做不到的,for循环也做不到
--在for循环的变量初始化表达式中声明的变量,和在外部声明是一样的
--因为ECMACScript不存在块级作用域(es6的let声明 是块级,之前没有)
--因此在循环内部定义的变量外部也可以访问
for-in语句
--一种精准的迭代语句
--用来枚举对象的属性
for(property in expression) { statement; }
举例
for(var propName in window) { console.log(propName); }
--使用for-in循环了BOM中window对象的所有属性
--与for语句类似,var也不是必须的
--但是我们推荐使用局部变量
--ECMAScript对象的属性是没有顺序的,
--所以遍历的顺序是不可预测的
--如果要迭代的对象为null或者undefined,会抛出错误
--es5更改了这一行为,变成不执行循环体
--建议在for-in之前检查对象不是null或者undefined 为了兼容
label语句
--在代码中添加标签,以便将来使用
label:statement;
例如
start:for(var i=0;i<10;i++) { console.log(i); }
--start标签可以由break或者continue语句引用
--加标签的语句一般都与for等循环语句配合使用
break和continue语句
--用于在循环中精准的控制代码的执行
--break语句会立即跳出循环,执行循环之后的代码
--continue会立即跳出本次循环,从循坏开始继续执行
var num = 0; for(var i=1;i<10;i++) { if(i%5 == 0) { break; } num++; } num; //4
--当i=5时,num=4,i%5 ==0 成立跳出循环
--循环了5次,第五次提前跳出循环,没有执行num++
var num = 0; for(var i=1;i<10;i++) { if(i%5 == 0) { continue; } num++; } num; //8
--当i=5时,num=4,i%5 ==0 成立跳出本次
--总共9次,i=5时,提前跳出本次循环,没有执行num++
--break和continue语句都可以和label语句联合使用,
--多发生在循环嵌套的情况下,break或者continue指定循环体
start: for(let i=0;i<5;i++) { for(let j=0;j<5;j++) { if(j==3) { continue start; //break start; } console.log(i+"-"+j); } }
--当条件成立跳出label指定循环结构
--continue start; j==3时,直接跳出本次并标出本层循环,从下一个i开始
--所以不会有j=4
--break start; j==3时,直接跳出这两层循环体
--所以不会有i=1 以及之后
with语句
--将代码的作用域设置到一个指定的对象中
with(expression) { statement; }
--用于简化多次编写同一对象的工作
var qs = location.search.substring(1); var hostName = location.hostname; var url = location.href;
--上面的代码都包含location对象,用with可以
with(location) { var qs = search.substring(1); var hostName = hostname; var url = href; }
--with语句关联了location对象,在with语句代码块中
--每个变量首先被认为是局部变量,如果在局部环境中找不到该变量的定义
--就会查询location对象中是否有同名属性,有,则以此为变量的值
--严格模式下不允许使用with语句,with语句会导致性能下降
--也给调试代码造成困难
--因此在开发大型应用程序时,不建议使用with
switch语句
--case 用于匹配值,并执行其中的语句(if)
--default 用于不匹配时,执行的语句(else)
--break用于跳出switch,
--不写则会在执行完当前case之后,不用判断继续执行下面的代码块中的代码
--ECMAScript中的switch 可以接受任何数据类型
--switch语句中的比较使用的是全等,所以 10 不等于 "10"
var a = "C" switch(a) { case "A": console.log("this is A"); break; case "B": case "C": console.log("this is B or C"); break; default: console.log("other"); }