JavaScript程序无非就是一系列可执行语句的集合。其中有很多语句和控制结构control structure来改变语句的默认执行顺序:
具有副作用的表达式是JavaScript中最简单的语句。
1、赋值语句:最常用
greeting="Hello "+name;
i*=3;
count++;
2、delete运算符:删除一个对象的属性。
delete o.x;
3、函数调用
alter(greeting);
window.close();
每行代码都是以分号;结束。
可以用逗号运算符将几个表达式连接在一起,形成一个表达式;
将多条语句联合在一起,形成一条复合语句。用花括号括起来即可,形成语句块。
{
x=Math.pr;
cx=Math.cos(x);
console.log(“cos(pi)=”+cx);
}
语句块需要注意:
空语句empty statement:执行时不做任何操作。
; //空语句
Notice:如果使用空语句时,最好在代码中添加注释。
for(var i=0;i<a.length;a[i++]=0) /*empty*/ ;
var和function都是声明语句,声明或定义变量和函数。
1、var:声明一个或多个变量
var name_1[=value_1[,…,name_n[=value_n]]]
关键字var之后跟随的是要声明的变量列表,列表中的每一个变量都可以带有初始化表达式,用于指定它的初始值。
var i;
var f=Math.cos(i),r;
var f=function(i){return i*i};
变量声明语句会被“提前”至脚本或函数的顶部,但是初始化操作仍在原来var语句的位置执行,声明语句之前的变量值为undefined。
2、function:
function funcname(arg1[,arg2[,…,argn]])
{ statement }
funcname是要声明的函数的名称的标识符。后跟参数列表。函数体中括号不能省略。
函数定义不能在if、while和其他任何语句中。
函数声明语句中的函数名是变量名,变量指向函数对象。
使用函数声明语句,函数名和函数体都会被提前,可以在声明JavaScript函数之前调用它。
1、if
有两种形式:
1)
if(expression)
statement
2)
if(expression)
statement1
else
statement2
if/else匹配规则是,else总是和就近的if语句匹配。
2、else if
if(expression1){ statement1 }
else if(expression2){ statement2 }
else if(expression3){ statement3 }
else{ statement4 }
3、switch:当所有分支依赖于同一个表达式的值时
switch(expression){
statement
}
swich(n){
case 1:statement1; break;
case 2:statement2; break;
case 3:statement3; break;
default:break;
}
如果没有break语句,switch会从expression的值相匹配的case标签处的代码开始执行,依次执行后续的语句,直到整个代码块结束。
1、while
while(expression){
statement
}
执行while之前,计算expression的值,如果为假,则程序跳转到while之后的逻辑执行;反之,进入循环体执行,直到expression为假,跳出。
2、do/while
do{
statement
}while(expression);
循环尾部检查表达式,则意味着循环至少执行一次。
以分号结束。
3、for
for(initialize;test;increment){
statement
}
for循环三个表达式可以省略,分号不能省略。
for(var i=0,j=0;i<10;i++,j--)
for(;o.next;o=o.next)
4、for/in
for(variable in object){
statement
}
首先计算object的值,若为undefined或null,则跳过循环;反之,JavaScript列举object的属性来执行循环,计算variable的值,将属性名赋值给它。
遍历数组:
for(var i=0;i<a.length;i++)
console.log(a[i]);
for(var p in a)
console.log(o[p]);
将对象的属性复制到数组:
var o={x:1,y:2,z:3};
var a=[],i=0;
for(a[i++] in o) /*empty*/;
for(i in a) console.log(i);//枚举数组索引0、1、2
for/in不会遍历所有属性,仅遍历”可枚举“的属性。
属性枚举的顺序:
先定义的属性先枚举。
若以对象直接量的形式创建对象,则将按照直接量中属性的出现顺序枚举。
1、标签语句
identifier:statement
只有break和continue能够使用标签。
mainloop:while(token!=null){
continue mainloop;//跳转到下一次循环
}
2、break
1) 单独使用break语句,立即退出最内层的循环或switch语句。
break;
单独的break语句只有在循环和switch语句中才是合法的。
for(var i=0;i<length;i++){ if(a[i]==0) break; }
2) break加标签
break lablename;
程序跳转到这个标签所标识的语句块的结束,或者直接终止直接闭合这个语句块的执行。
var matrix=getData();//从某处获取一个二维数组
//求矩阵的和
var sum=0,success=false;
compute_sum:if(matrix){
for(var x=0;x<matrix.length;x++){
var row=matrix[x];
if(!row) break compute_sum;
for(var y=0;y<row.length;y++){
var cell=row[y];
if(isNaN(cell)) break compute_sum;
sum+=cell;
}
}
success=true;
}
//break语句跳转到这里
不论break语句带不带标签,它的控制权都不能越过函数边界。
3、continue:不退出循环,而是转去执行下一次循环。
continue;
continue labelname;
只能在循环体内使用。
不同类型中,continue行为也有所区别:
1) while中,在循环开始处指定的expression会重复检测;
2) do/while中,程序的执行直接跳转到循环结尾处重新判断循环条件;
3) for中,首先计算自增表达式,再去检测test;
4) for/in中,循环遍历下一个属性名;
Notice:while循环直接进入下一轮的循环条件判断;for循环先计算increment,再去test。
4、return语句:指定函数调用后的返回值,只能出现在函数体内。
return expression;
如果没有return语句,函数调用一次执行到函数结束,最后调用表达式返回结果为undefined。
单独使用return,返回结果也是undefined。
5、throw语句:
异常–当发生了某种异常情况或错误时产生一个信号。
抛出异常–用信号通知错误或异常情况。
捕获异常–处理异常信号,采取必要手段从异常中恢复。
throw–显示抛出异常。
throw expression;
expression可以是任意类型。代表错误码的数字或者是可读的错误消息的字符串。
JavaScript抛出异常的时候采用Error类型和其子类型。Error对象包含name属性表示错误类型,message属性用来存放传递给构造函数的字符串。
function factorial(x){
//若输入非法抛出异常
if(x<0) throw new Error(“x can not be a negitive”);
//否则,计算,返回
for(var f=1;x>1;f*=f*x,x--)
return f;
}
当抛出异常时,JavaScript解释器会立即停止当前正在执行的逻辑,跳转到就近的异常处理程序。
6、try/catch/finally
try–定义了需要处理的异常所在的代码
catch–跟随在try从句之后,当try内发生异常时,执行catch内的逻辑代码
finally–放置清理代码。不关try中是否有异常,finally块内的逻辑始终会执行。
try可从catch和finally中选一个组成语句。
try{
//通常来讲,try内的代码不会抛出异常
//但有时会抛出异常,或者由throw直接抛出,要么是调用一个方法间接抛出异常
}
catch(e){
//e具有块级作用域
//try中有异常才会执行到这里
//可以通过局部变量e来获得Error对象或者抛出的其他值的引用
//可以处理异常,或者忽略异常,或者throw一个新的异常
}
finally{
//不管try中有没有异常,总是会执行这里的逻辑
//终止try块的方式有四种:
//1、正常终止
//2、通过break,continue、return终止
//3、抛出异常被catch捕获
//4、抛出异常,没有被捕获,向上传播
}
1、with:临时扩展作用链。
with(object){
statement
}
作用:将object加到作用域链的头部,执行statemen,恢复原始作用链。
适用于对象层次嵌套很深的情况下来简化代码。
document.form[0].name.value
document.form[0].address.value
document.form[0].email.value
等同于
with(document.form[0]){
name.value=””;
address.value=””;
email.value=””;
}
Notice:只有在查找标识符的时候才会用作用域链
with(o){ x=1; }
若o有x属性,则赋值为1;若没有,则上面代码等同于x=1,给局部或全局变量赋值,或者创建全局对象的新属性。
with语句提供了访问o的属性的快捷方式,但并不创建新的属性。
2、debugger语句:调试模式运行下作用
3、use strict:说明后续的代码会解析为严格模式
引入的指令,不包含任何关键字,只能出现在脚本代码的开始或函数体的开始、任何实体语句的开始。
严格模式和非严格模式的区别:
1) 严格模式禁用with语句
2) 严格模式所有的变量需要声明,否则会抛出引用错误异常
3) 严格模式调用函数的this值是undefined;
//可用来判断是否支持严格模式
var hasStrict=(function(){“ues strict”;return this===undefined;});
4) 严格模式不允许使用八进制整数直接量
5) 严格模式中,对象直接量中不能定义两个或多个同名属性,否则会产生语法错误
6) 严格模式中,函数声明中不允许存在两个或多个同名变量
……