七、语句
1、表达式语句
- 赋值语句
- delete运算符:用于删除一个对象的属性。
delete o.x;
- 函数调用
2、复合语句和空语句
- 复合语句:用花括号将多条语句括起来。语句块结尾不需要分号,块中的原始语句必须以分号结束。
- 空语句:包含0条语句的语句。
;
3、声明语句
1)var
var name1 [= value1] [,...,nameN [= valueN]];
2)function
function funcname(arg1,...,argn){
statements
}
4、条件语句
1)if语句
if (condition){
statement1
}
else{
statement2
}
2)else if
if (condition1){
statement1
}
else if (condition2){
statement2
}
else{
statement3
}
3)switch语句
switch (expression) {
case value: statement
break;
case value: statement
break;
case value: statement
break;
case value: statement
break;
default: statement
}
break会导致代码执行流跳出switch语句。如果省略,就会导致执行完当前case后,继续执行下一个case。
特别说明,switch可以使用任何数据类型;并且,每一个case的值不一定是常量,可以是变量,甚至是表达式。
5、循环
1)while语句
前测试循环语句。先判断再执行,满足条件才会执行循环体内的代码块。
while (expression){
statement
}
2)do-while语句
后测试循环语句。无论是否满足条件,都会执行一次循环体内的代码块。
do {
statement
}while (expression);
3)for语句
- 前测试循环语句。
- 具有在循环之前初始化变量和定义循环后要执行的代码的能力。
- for语句中的初始化表达式、控制表达式和循环后的表达式都是可选的。
for (initialization; expression; post-loop-expression){
statement
}
- 在for循环的变量初始化表达式中,可以不使用var关键字,该变量的初始化可以在外部执行。
- 在循环内部定义的变量可以在外部访问到,这是因为ECMAScript中不存在块级作用域。
var count = 10;
for (var i = 0; i < count; i++){
alert(i);
}
alert(i); // 10
4)for-in语句:迭代语句,可以用来枚举对象的属性。
for (property in expression){
statement
}
使用for循环来遍历数组元素非常简单,而for-in循环则是用来更方便地遍历对象属性成员。
//for循环遍历数组元素
for (var i=0;i<a.length;i++){
console.log(a[i]);
}
//for-in循环遍历数组元素
for (i in a) {
console.log(i);
}
//遍历对象属性成员
//将属性名字赋给变量p,输出每一个属性的值
for (var p in o) {
console.log(o[p]);
}
如果要迭代的对象的变量值为null或undefined,会抛出错误。但在ECMAScript5中,只是不执行该循环体,不会抛出错误。所以,建议在使用for-in循环之前,先检测该对象是否为null或undefined。
6、跳转
1)标签语句(label语句):在代码中添加标签。
label:statement
- 定义的标签可以在将来的break或continue语句引用。
- 加标签的语句一般都与循环语句配合使用。
2)break语句
break;
break labelname;
- 单独使用的作用是立即退出最内层的循环或switch语句。
- 当break和标签一块使用时,程序将跳转到这个标签所标识的语句块的结束,或直接终止这个闭合语句块的执行。
var num = 0;
outermost:
for (var i = 0; i < 10; i++){
for (var j = 0; j < 10; j++){
if (i == 5 && j == 5){
break outermost;
}
num++;
}
}
alert(num); // 55
在上面的代码中,如果每个循环正常执行到结束,num的值为100。但是,添加了这个标签就导致break语句不仅退出了内部循环,也退出了外部循环。
3)continue语句
continue;
continue labelname;
- 只能在循环体内使用。
- 不是退出循环,而是转而执行下一次循环。
var num = 0;
outermost:
for (var i = 0; i < 10; i++){
for (var j = 0; j < 10; j++){
if (i == 5 && j == 5){
continue outermost;
}
num++;
}
}
alert(num); // 95
在上述中,continue语句会强制继续执行循环,即退出内部循环,执行外部循环。
4)return语句
return expression; //expression可带可不带
只能在函数体内出现。
5)throw语句:抛出异常。
throw expression;
6)try/catch/finally语句
try {
//通常来讲,这里的代码会从头执行到尾而不会产生任何问题,
//但有时会抛出一个异常,要么是由throw语句直接抛出异常,
//要么是通过调用一个方法间接抛出异常
}
catch(e) {
//当且仅当try语句块抛出了异常,才会执行这里的代码
//这里可以通过局部变量e来获得对Error对象或者抛出的其他值的引用,
//这里的代码块可以基于某种原因处理这个异常,也可以忽略这个异常,
//还可以通过throw语句重新抛出异常
}
finally {
//不管try语句是否抛出了异常,这里的逻辑总是会执行,终止try语句块的方式有:
//1)正常终止,执行完语句块的最后一条语句
//2)通过break、continue或return语句终止
//3)抛出一个异常,异常被catch从句捕获
//4)抛出一个异常,异常未被捕获,继续向上传播
}
7、with语句
- 将代码的作用域设置到一个特定的对象中。
- 定义with语句的目的是为了简化多次编写同一个对象的工作。
with (expression){ //将expression添加到作用域链的头部
statement; //然后执行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语句,否则将视为语法错误。
- 大量使用with语句会导致性能下降,所以不推荐使用。
8、debugger语句
通常什么也不做。但是,当调试程序可用并运行的时候,JavaScript解释器将会以调试模式运行。实际上,这条语句用来产生一个断点。
9、“use strict”
- 是一条指令。
- 在顶层代码使用这个指令,就说明后续的代码将会解析为严格代码。