当前位置: 代码迷 >> JavaScript >> JavaScript中的话语
  详细解决方案

JavaScript中的话语

热度:32   发布时间:2012-09-19 13:43:54.0
JavaScript中的语句

一、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 = "";
}

?

不过不建议使用。缺点:

  • 难优化
  • 速度慢
  • 容易让人困惑

?

?

?

  相关解决方案