如果你是C、C++或者Java程序员,那么你一定会发现JavaScript的语句十分面熟。所以这里只讨论JavaScript的比较特别的语句,那些常见语句就省略了。
① for/in语句:
for/in语句是个有点特别的循环语句,它的语法如下:
for(variable in object)
statement
variable应该是一个变量名,声明一个变量的var语句,数组的一个元素或者是对象的一个属性。object是一个对象名,或者是计算结果为对象的表达式。statement通常是一个原始语句或者语句块,它构成了循环的主体。
for/in循环提供了一种遍历对象属性的方法。for/in循环的主体对object的每个属性执行一次。在循环体执行之前,对象的一个属性名会被作为字符串赋给变量variable。在循环体内部,可以使用这个变量和“[ ]”运算符来查询该对象属性的值。例如下面的for/in循环将输出一个对象的所有属性名及它的值:
for(var prop in my_object){ document.write("name:"+prop+"; value:"+my_object[prop],"<br>"); }
可以采用下面的代码把一个对象的所有属性名复制到一个数组中:
var o={x:1,y:2,z:3}; var a=new Array(); var i=0; for(a[i++] in o)/*empty loop body*/;
JavaScript的数组不过是一种特殊的对象。因此for/in循环像枚举对象属性一样枚举数组下标。例如在前面的代码块后面加上下面这行代码可以枚举数组的属性0、1、2:
for(i in a) alert(i);
其实for/in循环并不会遍历对象的所有可能的属性。对象的有些属性以相同的方式标记成了只读的、不可删除的或者不可列举的。这些属性使用for/in循环不能枚举出来。虽然所有的用户定义属性都可以枚举,但是许多内部属性包括所有的内部方法都是不可枚举的。对象可以继承其他对象的属性,那些已继承的用户定义的属性可以使用for/in循环枚举出来。
② var语句:
由var语句创建的一个特性或多个特性不能用delete运算符来删除。var语句还能作为for循环和for/in循环的一部分:
for(var i=0;i<10;i++) document.write(i,"<br>");
③ function语句:
function语句定义了一个JavaScript函数。function语句的主体必须使用大括号,即使主体只有一条语句。从技术上说,function语句并非是一个语句。在JavaScript程序中,语句会引发动态的行为,但是函数定义描述的却是静态的程序结构。语句是在运行时执行的,而函数定义在解析时发生,并不是在运行时发生,这一事实产生了某些令人吃惊的作用。考虑下面的代码:
alert(f(4)); //16 var f=0; function f(x){ return x*x; } alert(f); //0
出现这种特殊的结果是由于函数定义和变量定义发生在不同时刻。幸运的是,这种情况并不常常发生。