6.2 简单语句
本节将介绍各种常见的简单语句形式。
6.2.1 表达式语句
表达式与语句的区别如下。
从句法角度分析,表达式是短语(或称为词);语句是一个句子。
从组成角度分析,表达式由运算数和运算符组成;语句由命令关键字和表达式组成。表达式之间可以通过空格分隔;而语句之间必须通过分号分隔。表达式可以包含子表达式,语句也可以包含子语句。
从表现角度分析,表达式呈现静态性;而语句呈现动态性。
从结果趋向分析,表达式返回一个值;而语句完成特定任务。
任何表达式加上分号,就会形成语句,也称为表达式语句。
【示例1】下面这个句子仅是一个数值直接量,它是最简单的句子,也是最简单的表达式。
1; //世界上最简单的句子
【示例2】下面这行长代码是一个赋值语句:
o =new ((o == "String")? String:(o == "Array")? Array:(o == "Number")? Number:(o == "Math")? Math:(o == "Date")? Date:(o == "Boolean")? Boolean:(o == "RegExp")? RegExp:Object);
如果格式化显示等号右侧的代码,它就是一个多重选择结构的连续运算:
new((o=="String")? String : (o=="Array")? Array : (o=="Number")? Number : (o=="Math")? Math : (o=="Date")? Date : (o=="Boolean")? Boolean : (o=="RegExp")? RegExp : Object);
代码虽然很长,不过它也只是一个表达式语句。
提示:大部分表达式语句都具有破坏性,完成任务后会改变变量自身的值,如赋值语句、函数调用语句、声明变量语句、定义函数语句等。
6.2.2 复合语句
多个句子(Statement)放在一起就是一个语句段(Statement Block),如果使用大括号括起来,就成了复合语句(Statements)。单个句子被包括在大括号中,也是复合语句。
【示例1】下面两个句子是相互独立的。当脚本被执行时,它们会按顺序被执行:
alert("Hello"); alert("World");
如果在条件结构中,这种分散状态就不好控制。例如,下面的条件结构只能够控制第一个句子,第二个句子依然能够执行:
if(false) alert("Hello"); alert("World");
如果使用复合语句,用大括号把它们包裹在一起,如果再使用条件结构,就比较方便控制。
if(false) { alert("Hello"); alert("World"); };
注意:这里的大括号不是条件结构的一部分,而是复合语句的一部分。
【示例2】即使没有条件结构,一样可以使用大括号把多个句子括起来作为一个复合语句来使用,此时该复合语句与多个独立单句在最终执行结果上都是一样的。
{ alert("Hello"); alert("World"); };
复合语句末尾可以不用分号进行分隔,但是内部每个子句必须使用分号分隔,最后一个子句可以省略分号,因为它不会产生语法歧义。
【示例3】复合语句的结构比较复杂,它可以包含子句,也可以包含复句,形成结构嵌套。对于复句内的子句可以通过缩排版式以增强代码的可读性。
{ //空复句 } { alert("单复句"); } { alert("Hello, World! "); { alert("复句嵌套"); } }
6.2.3 声明语句
var和function表示声明语句,用来声明变量或定义函数,可以在程序中任意位置使用。
1.var
var语句用来声明一个或者多个变量,关键字var后面可以跟随声明变量的列表,变量之间以逗号运算符进行分隔。声明变量时可以同时赋值,以实现对变量进行初始化。
【示例1】下面代码分别以不同形式声明多个变量并赋值。
var a; //声明一个变量 var a=0; //声明一个变量并赋值 var a, b; //同时声明两个变量 var a=0, b=true, c, d; //声明4个变量,并部分赋值
【示例2】如果var语句声明变量时,没有赋值,则JavaScript会默认变量初始值为undefined。
var a; alert(a); //返回undefined
【示例3】var语句是通过在当前调用对象中创建同名属性来实现定义每个变量的。
var a=1; function f(){ var a=2; alert(a); //返回2 } alert(window.a); //返回1 f(); //调用函数对象
在上面的代码中,第一个声明的变量a是作为全局对象Window的属性而存在的,而第二个声明变量a是作为函数f()的调用对象的属性而存在的。当全局对象或者函数调用对象被初始化时,JavaScript解释器会在相应的代码段中寻找var声明的变量,然后在全局对象或者调用对象中创建相应的属性,此时它是未赋值的。当程序执行到相应的var声明代码段时才会给相应对象的属性赋值。因此,使用var语句重复声明变量时,不会引发编译错误。
var语句声明的变量是JavaScript标准声明变量的方法,同时使用var语句声明的变量是永久性的,不能够使用delete运算符删除该变量。
【示例4】var语句的使用是有限制的,它不能在循环或条件结构内的条件表达式中使用。例如,下面的用法都是错误的:
while(var i = 0, (i ++) < 10){ alert(i); }
下面用法也是错误的:
if(var i = false){ alert(i); }
但是,它可以在for或for/in结构中的条件表达式中使用:
for(var i = 0; i<10; i++){ alert(i); } for(var i in document){ alert(i); }
2.function
使用function声明语句可以声明一个函数。
【示例5】下面的代码使用了function语句声明一个函数f。
function f(){ alert("声明并初始化函数变量"); }
其中变量名为f,变量初始值为一个函数体结构。
【示例6】也可以把函数作为一个值,赋值给一个变量。
例如,上面的函数声明语句可以转换为:
var f = function(){ alert("声明并初始化函数变量"); }
上面代码相当于把一个匿名函数赋值给变量f。
6.2.4 空语句
空语句,顾名思义就是没有任何代码的句子,它只有一个分号(;),表示该语句的结束。例如:
; //空语句
空语句不会产生任何作用,也不会执行任何动作,相当于一个占位符。
【示例1】在循环结构中使用空语句可以设计假循环或者空循环:
for(var i = 0; i < 10; i ++ ) { ; }
上面代码可以简写为:
for(var i = 0; i < 10; i ++ );
【示例2】空语句易引发错误,最安全的方法是使用复合语句的形式来表示,或者加上注释,避免遗漏。
for(var i = 0; i < 10; i ++ )/*空语句*/;
或者
for(var i = 0; i < 10; i ++ ){ ; }