定义:表达式在Javascript中是短语,而语句则是Javascript整句或命令。简单的来说,javascript语句以分号结束,表达式计算出一个值,语句用来执行以使某件事发生。
“使某件事发生”的一个方法是计算带有副作用的表达式。诸如赋值和函数调用这些有副作用的表达式,是可以作为单独的语句的,这种把表达式当做语句的用法也称作表达式语句,类似的语句还有声明语句,声明语句用来声明新变量或定义新函数。
Javascript程序无非就是一系列可执行语句的集合。默认情况下,Javascript解释器依照语句的编写顺序依次执行。另一种“使事件发生”的方法是改变语句的默认执行顺序。Javascript中有很多语句和控制结构来改变语句的默认执行顺序:
条件语句,Javascript解释器可以根据一个表达式的值来判断是执行还是跳过这些语句,如if语句和switch语句。
循环语句,可以重复执行语句,如while和for语句。
跳转语句,可以让解释器跳转至程序的其他部分继续执行,如break,return和throw语句。
***表达式语句
具有副作用的表达式是Javascript中最简单的语句,而赋值语句是一类比较重要的表达式语句,例如:
greeting = "Hello"+name; i *= 3;
递增运算符(++)和递减运算符(--)和赋值语句有关。它们的作用是改变一个变量的值,就像执行一条赋值语句一样:
counter++;
delete运算符的重要作用是删除一个对象的属性,所以,它一般作为语句使用,而不是作为复杂表达式的一部分:
delete o.x;
函数调用是表达式语句的另一个大类,例如:
alert(greeting); window.close();
虽然这些客户端函数调用都是表达式,但它们都对Web浏览器造成了一些影响,所以我们认为它们也是语句。调用一个没有任何副作用的函数是没有意义的,除非它是复杂表达式或赋值语句的一部分,例如,不可能计算了一个余弦值随即把它丢弃:
Math.cos(x);
相反,得出了余弦值就得把它赋值给一个变量,以便将来才能使用这个值:
cx = Math.cos(x);
***复合语句和空语句
可以用逗号运算符将几个表达式连接在一起,形成一个表达式,同样,Javascript中还可以将多条语句联合在一起,形成一条复合语句,只须用花括号将多条语句括起来即可。比如:
{ x = Math.PI; cx = Math.cos(x); console.log("con(x)="+cx); }
关于语句块有几点需要注意:
第一,语句块的结尾不需要分号。块中的原始语句必须以分号结束,但语句块不需要。
第二,语句块中的行都有缩进,然而这并不是必需的,但整齐的缩进可以增加代码的可读性,更便于理解。
第三,Javascript中没有块级作用域,在语句块中声明的变量并不是语句块私有的。
将多条语句合并成一个大语句块的做法在javascript中是非常常见的,类似表达式通常包含子表达式一样,很多javascript语句包含其他子语句。从形式上讲,Javascript语句通常允许一个语句块只包含一条子语句。例如,while循环的循环体就可以只包含一条语句。使用语句块可以将任意数量的语句放到这个块中,这个语句块可以作为一条语句使用。
在Javascript中,当希望多条语句被当做一条语句使用时,使用复合语句来代替。空语句则恰好相反,它允许包含0条语句的语句。
; //直接一个分号,就是空语句
Javascript解释器执行空语句时它显然不会执行任何动作,但实践证明,当创建一个具有空循环体的循环时,空语句有时还是很有用的,比如下面这个for循环。
//初始化一个数组a for(i = 0; i<a.length;a[i++] =0);
在这个循环中,所有的操作都在表达式a[i++]=0中完成,这里并不需要任何循环体。然而javascript需要循环体中至少包含一条语句,因此,这里只使用了一个单独的分号来表示一条空语句。
使用空语句需要注意的是,在for循环,while循环或if语句的右括号后的分号很不起眼,这一点就很容易造成一些致命的bug,而这些bug又因为空语句的不起眼,从而很难被定位到。例如:
if((a ==0)||(b == 0)); //这一行代码其实什么都没有做 o = null; //而这一行代码总是会被执行
如果有特殊的目的需要使用空语句,最好在代码中添加注释,这样可以更清楚地说明这条空语句是有用的,例如:
for(i =0; i<a.length; a[i++] = 0)/* empty */;
***声明语句
var和function都是声明语句,它们声明或定义变量或函数,这些语句定义标识符(变量名和函数名)并给其赋值,这些标识符可以在程序中任意地方使用。声明语句本身什么也不做,但它有一个重要的意义,通过创建变量和函数,可以更好的组织代码的语义。