一、switch语句
JavaScript允许case语句后跟任意的表达式,其中case的匹配用于===(等同于)进行匹配的,所以不能有类型的转换过程:
case 60*60*24: case Math.PI: case n+1: case a[0]:
如果未找着匹配的项,则执行标签为default的语句,default语句理论上可以放在switch中的任何位置,不过一般放在最后。
对比:在c、c++和java中,case表达式必须是编译时常量,因此效率比JavaScript中高。
二、for/in语句
for (variable in object)
statement
其中:
- variable:适用于赋值表达式左边的值:var语句、数组的一个元素或对象的一个属性
- object:对象名或者计算结果为对象的表达式
- statement:循环主体
for/in循环的主体是对对象的每个属性执行一次,在循环前,对象的一个属性名会被作为字符串赋给变量variable,然后在循环体内可以用变量和"[]"运算符来查询该属性的值:
for ( var prop in my_object) document.write("name: "+prop+"; "+my_object[prop], "</br>");
一个简单、快捷的复制对象所有属性到数组的代码:
var o = {x:1, y:2, z:3};
var a = new Array();
var i = 0;
for(a[i++] in o);
三、continue语句
continue语句用于结束当前循环,开始执行下一次迭代。对于不同类型的循环语句意义不同:
- 在while循环中,会再次检测开头的expression,如果值为true,则从头开始执行循环
- 在do/while循环中,会跳到循环的底部,从顶部开始下次循环前,会先在此检测循环条件
- 在for循环中,先计算increment的表达式,然后再检测test表达式以确定是否可以执行下一次迭代
- 在for/in循环中,将以下一个赋给循环变量的属性名再次开始新的迭代
注意:在while和for中的continue行为有不同:在while中先跳到循环条件处;在for中,先计算increment,然后再到循环条件处。因此在这两种循环中continue的语句行为有不同,所以用一个while循环来完全模拟一个for循环是不可能的。
四、function
函数嵌套只能在函数顶层中出现,即不能出现在例如if、while等语句中。JavaScript中函数是在解析时发生,而不是在运行时。例如:
alert(f(4)); //16
var f = 0; //覆盖f
function f(x){ //函数定义,在任何语句执行前
return x*x;
}
alert(f); //f已经被覆盖,结果为0
五、throw语句
语法:throw expression;
其中expression可以是任何类型,通常是一个Error对象或者是Error的子类。例如:
function factorial(x){
if(x<0) throw new Error("x must not be negative");
for(var f = 1;x>1;f*=x,x++);
return f;
}
使用try/catch/finally语句来捕捉异常,例如:
try{
....
}catch(ex){
...
}finally{
...
finally在最终跳转之前被执行,但是如果finally本身含有return、break、continue语句或throw语句转移控制流,或者调用了抛出异常的方法改变了控制流,那么等待的控制流转移将被舍弃,并进行新的转移。
六、with语句
在文章http://liugang594.iteye.com/blog/1523878,我们讨论了作用域链,用来解析变量名。with语句则是用于暂时修改作用域链。语法如下:
with(object)
statement
这一语句用于将object添加到作用域链的头部,然后执行statement,再把作用域恢复到原始状态 。
实际应用时,with可以减少大量输入,例如要访问某个HTML表单元素:
frames[i].document.forms[0].address.value
如果需要多次访问这个变量,则使用with语句可以简单的多:
with(frames[i].document.forms[0]){
name.value = "";
address.value = "";
email.value = "";
}
不过不建议使用。缺点:
- 难优化
- 速度慢
- 容易让人困惑