程序都是由一个或多个语句组成的集合。语句表示一个可执行的命令,用来完成特定的任务。大部分语句用于流程控制。
以结构划分,语句分为单句和复句:
语句类型 | 语句子类型 | 逻辑概念 | 示例 | |
---|---|---|---|---|
声明变量 | 变量声明语句 | 为变量指定储存地址 | var variable [=value],variable2 [=value2]...]; | |
声明变量 | 标签声明语句 | 为语句建立索引 | label : statements | |
表达式语句 | 赋值语句 | 为变量赋值 | variable = value | |
表达式语句 | 函数调用语句 | 执行函数 | function () | |
表达式语句 | 方法调用函数 | 执行函数 | object.method(); | |
表达式语句 | 属性赋值语句 | 为变量对象赋值 | object.property = value;', | |
分支语句 | if | 选择执行 | if(expression)statements[else statements] | |
分支语句 | switch | 选择执行 | switch(expression){case label:statementList case labelList:statementList...default:statementList}', | |
循环语句 | for | 重复执行 | for ([var] initialization;test; increment)statements | |
循环语句 | for/in | 遍历执行 | for([var] variable in <object | array >)statements |
循环语句 | while | 重复执行 | while(expression)statement | |
循环语句 | do/while | 重复执行 | do statement while(expression) | |
控制语句 | continue | 继续执行 | continue [label]; | |
控制语句 | break | 中断执行 | break [label] | |
控制语句 | return | 执行返回 | return [expression]; | |
控制语句 | throw | 抛出异常 | throw [exception] | |
控制语句 | try | 尝试执行 | try{statements} | |
控制语句 | catch | 捕获异常 | catch(exception){statement} | |
控制语句 | finally | 最后执行 | finally{statements} | |
其它语句 | 空语句 | 不执行 | ; | |
其它语句 | with | 暂时作用域 | with( object ) statements |
名词说明 。
表达式与语句区别。
大多数表达式具有破坏性,完成任务后会改变自身的值,如赋值语句、函数调用、声明变量、定义函数语句。
多个语句放在一起就是一个语句段;如果用大括号括起来,就是复合语句。
用 var 和 function 表示语句 。
只有 分号 而无内容 空语句易引起错误,避免遗漏建议写注释。
// if 单分枝
if (true) {
do();
}
// 双分枝
if () {
} else {
}
// 多分枝
if () {
} else if () {
} else {
}
// switch
switch () {
case 1:
break;
case 2:
break;
default:
break;
}
for( [var] variable in < object | array> ) statement
在对数组或对象使用 for 循环时,注意必须确保没有使用原型链扩展数组或对象的属性
for each (variableIterant in object)
for/in 是 for 的一种特殊形式。
for ( [var | let] variable in <object | array>) {
// statement
}
variable 表示一个变量,可以在其前面附加 var 语句,用来直接声明变量。 in 后面是一个对象或数组类型的表达式。在遍历对象或数组过程中,把获取的每一个值赋给 variable 。
在运行该循环结构时,会声明一个变量,然后计算对象或数组类型的表达式,并遍历该对象或表达式。在遍历过程中,每获取一个对象或数组,就会临时把对象或数组中元素储存在 variable 指定的变量中。注意对于数组来说,该变量储存的是数组的元素的下标;而对象来说,该变量储存的是对象的属性名或方法名。
然后,执行 statement 语句,其中可以访问 variable 来读取每个对象属性或数组元素的值。执行完后,返回继续枚举的下一个元素,周而复始,直到所有的元素被枚举完。
var a = [1, true, '0', [false], {}];
for (var n in a) {
console.log('a[' + n + '] = ' + a[n] + '<gt;');
}
利用枚举法复制数组
var o = { x: 1, y: true, z: 'true' };
var a = [];
var n = 0;
for (a[n++] in o);
for/in 能够枚举对象的所有成员,但是如果是对象的成员被设置成只读、存档或不可枚举等属性,那么 for/in 语句是无法枚举的。因此,当使用内置对象时,可能就无法读取全部的属性。
由于对象没有固定的顺序,所以,在使用 for/in 循环时也无法判断遍历的顺序,因此在遍历结果中看到不同的排列顺序。
在 for/in 中改变枚举对象的属性可能会导致意外的发生,所以一般不建议随意在循环体内操作属性。
for 和 while 语句都是用来设计循环,完成特定动作的重复性操作。不过,使用时不可随意替换。
语义 | while 结构是依据特定条件来决定是否循环,条件是动态的,无法预知条件何时为 true 或 false 。而 for 语句是有规律的,常用在数组、对象、集合中 |
模式 | for 把循环三要素定义为结构语法的一部分,比 while 更能快速编译,更适合结构简单的数值迭代操作。 |
目标 | 一般来说,在循环结构中动态改变变量的值时采用 while ,而对于静态的循环变量,则考虑 for |
条件 | while 根据表达式决定循环结构; for 根据操作次数决定循环的操作 |
结构 | while 比较复杂,结构相对宽松; for 比较简洁,要求结构比较严谨 |
效率 | while 存在一定安全隐患 ; for 执行效率比较高 |
变种 | while do/while; for for/in |
在 JavaScript 中,任何语句都可以添加标签。以便在复杂的结构中设置程序的跳转路径。定义标签的语法如下:
label: statements;
label 可以是任何的标识符,但不能是保留字。由于标签名与变量名属于不同于的语法体系,所以不用担心标签名和变量名重叠。然后使用冒号分隔标签和标签语句。
由于标签名和属性名都属于标签范畴,不能重名。
break 语句能够终止循环和多重分子结构的执行。主要是在循环结构和 switch 语句中,用在其它位置都是非法的。
break 后跟随一个标签名,用来指示程序终止执行之后要跳转的位置,并以该标签语句末尾的位置为起点继续执行。
continue 和 break 语句都是独立的语句,用于循环结构, break 语句用于终止循环,而 continue 用于停止当前的循环,继续下一次的循环。
与 break 相同, continue 后可跟着一个标签名,用于指定跳转循环结构的起始位置。
let 语句允许使用标识符来标示一个语句,其语法格式如下:
let (expressionA, expressionB, ...) {statementA;statementB;}
yield 语句可以在循环语句中产生一个输出值并返回,包含 yield 语句的循环经常位于函数中,包含 yield 语句的函数称为产生器。用户可以使用迭代器遍历产生器。
with 语句可以方便地用来引用某个特定对象的方法和属性,语法格式如下:
with (object) {
statement(s);
}
参数 object 是某个 JavaScript 对象;参数 statement(s) 表示花括号中包含的一个或一组语句。
使用 with 语句,允许用户使用 object 参数指定一个对象,并使用 statement(s) 参数计算对象的方法和属性,这样可以使用户不必重复书写对象的名称。
例如下面的代码:
var rightNow = new Date();
with (rightNow) {
console.log(getDay() + '');
console.log(getMonth() + 1 + '');
console.log(getFullYear() + '');
}
如果不使用 with 语句,则必须按如下方式书写:
var rightNow = new Date();
console.log(rightNow.getDay() + '');
console.log(rightNow.getMonth() + 1 + '');
console.log(rightNow.getFullYear() + '');
with 语句的作用在于省略了 rightNow 这个对象。
1 | 在 with 语句最里面的 object 参数指定的对象 |
2 | 在 with 语句最外面的 object 参数指定的对象 |
3 | 激活的对象(当调用函数时自动创建的临时对象,该函数包含调用的局部变量) |
4 | 该对象包含当前正在指定的脚本 |
5 | 全局对象 |
在 JavaScript 中,使用 label 语句可以为一行语句添加标签,以便在复杂的结构中设置跳转目标。语法:
label: statements;
break 语句能够结束当前的 for 、 for/in 、 while 、 do/while 或者 switch 语句的执行。同时 break
可以接受一个可选的标签名,来结束跳出的结构语句,没有设置标签名,则跳出最内层的结构。
break label;
continue 主要用于循环的内部,用于跳转本次循环的后续代码。也可接受一个标签名,跳出特定的循环结构。
优化循环结构
在 JavaScript 中查表法可通过普通对象或数组实现,比 if 和 switch 都快,特别是当条目特别大的时候。与 if 和 switch 相比,查表法不仅速度快,而且当需要测试的离散值数量非常大时,有助于保持代码的可读性。
对于任何循环来说,每次执行的循环体都发生
优化循环的第一步就是减少对象成员和数组项查找的次数。
可以简单地将值存成一个局部变量,在控制条件中使用局部变量,从而提高性能。
通常,数组的处理顺序与任务无关,可以从最后一个开始,直到处理第一个元素。倒叙循环是编程语言中常用的优化方法。