JavaScript权威指南--Chapter5 语句

JavaScript程序无非就是一系列可执行语句的集合。其中有很多语句和控制结构control structure来改变语句的默认执行顺序:

  • 条件conditional语句:if语句、switch语句
  • 循环loop语句:while语句、for语句
  • 跳转jump语句:break、return、throw。让JavaScript解释器跳转至程序的其他部分继续执行。

一、表达式语句:

具有副作用的表达式是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);
}

语句块需要注意:

  • 结尾不需要分号,块中原始语句必须以分号结束;
  • JavaScript中没有块级作用域,所以在语句块中声明的变量并不是私有的。

空语句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语句出现在函数体内,则为局部变量,作用域为这个函数。
  • 如果var语句出现在顶层代码中,则为全局变量,作用域为整个JavaScript程序。
  • var声明的变量不能通过delete删除。
  • 如果var语句中的变量没有指定初始化表达式,那么这个变量的值初始化为undefined。

变量声明语句会被“提前”至脚本或函数的顶部,但是初始化操作仍在原来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
}
  • initialize表达式只在循环开始之前执行一次。

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
}
  • variable必须是一个适用于赋值表达式左侧的值。
  • object是一个对象。

首先计算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不会遍历所有属性,仅遍历”可枚举“的属性。

  • 所有JavaScript内置方法不是”可枚举“的。
  • 代码中定义的所有属性和方法都是可枚举的。
  • 对象继承其他的对象属性也是可枚举的。
  • 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;

程序跳转到这个标签所标识的语句块的结束,或者直接终止直接闭合这个语句块的执行。

  • 当没有任何闭合语句块指定了break所用的标签,则产生一个语法错误。
  • 当使用这种形式的break语句,标签语句不应该是循环或switch语句。
  • 当你希望用break来跳出非就近的循环或switch语句,则使用break+标签。
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) 严格模式中,函数声明中不允许存在两个或多个同名变量
……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值