《JavaScript高级程序设计》学习笔记(第三章)- 下
语句
ECMAScript中的语句与其它语言的语句使用方法是一致的。只是有一个需要注意的问题是,ECMAScript中不存在块级作用域,所以在代码块中定义的局部变量,在外部也可以访问到。
if语句
语法格式:
if(condition) statement1 else statement2
为了防止不必要的错误,最好将statement
放到大括号中,使其成为代码块,即使只有一条语句也要使用大括号。
do-while语句
语法格式:
do {
statement
} while (expression);
do-while
循环里面的语句至少会被执行一次。
while语句
语法格式:
while(expression) statemet
因为while
循环是在执行循环体前进行判断测试,所以有可能循环体内的代码一次也没有执行到。
for语句
语法格式:
for (initialization; expression; post-loop-expression) statement
for
语句相当于将while
循环有关的代码集中到了一个位置,两种循环没有本质上的区别。使用while
循环做不到的,使用for
循环同样也做不到。for
循环是三种循环中最灵活,也是最常用的。
for-in语句
语法格式:
for (property in expression) statement
for-in
语句一般可以用来枚举对象的属性。ECMAScript的对象属性没有顺序,因此for-in
输出的属性名顺序是不可预测的。
label语句
label
语句主要用来与break
或continue
配合使用。
break和continue语句
break
语句主要用于完全跳出循环体,强制继续执行循环后面的语句。而continue
则用于跳过本次循环的执行,会回到循环的顶部继续执行。
同时这两个语句都能配合label
语句使用,但是由于加过多的标签会让程序的执行顺序变得混乱,所以最好避免使用这种方法。
with语句
with
语句在其它语言中并没有,这个语句的作用是将代码的作用域设置到一个特定的对象中。
语法格式:
with (expression) statement;
因为大量使用with
语句会导致性能下降,同时也会给调试代码造成困难,因此在开发大型应用的时候,不建议使用with
语句。
siwtch语句
语法格式:
switch (expression) {
case value: statement
break;
case value: statement
break;
case value: statement
break;
case value: statement
break;
default: statement
}
这个语句主要用在多重选择中,避免使用大量的if-else
语句。
ECMAScript中的switch
选择语句可以使用任何数据类型,而不止是数值类型。同时,每个case
的值不一定是常量,也可以是变量,甚至是表达式。
switch
语句在比较值时用的是全等操作符,因此不会发生类型转换。
函数
基本语法:
function functionName(arg0, arg1,...,argN) {
statements
}
在ECMAScript中的函数不需要指定是否需要返回值,任何函数在任何时候都可以通过reture
语句后跟要返回的值来实现返回值。如果return
后不跟返回值,或者根本没有指定return
语句,则系统会自动返回undefined
。
理解参数
ECMAScript中没有函数签名的概念,函数不管传递进来几个参数,也不在乎每个参数的数据类型。也就是说,即使你定义的函数只接收两个参数,在调用的时候也可以传递任意个参数进来,解析器也不会报错。
事实上,ECMAScript中的参数在内部是用一个数组来表示的,可以在函数在使用arguments
来获得传进来的参数。arguments
与数组类似,可以使用下标来取得特定的元素,也能通过length
来获得参数的个数。
因此,ECMAScript的参数实际上是相当灵活的,类似于C语言中的变长参数。同时,没有传递值的命名参数将被赋值为undefined
,这与定义了变量但又没有初始化是一样的。
没有重载
根据上面讲的原理,因为ECMAScript中根本没有函数签名的概念,因为也就无法实现函数的重载。
如果定义了两个名字相同的函数,则该名字只属于后定义的函数,相当于前面的函数定义被后面的函数覆盖掉了。我们可以通过检查传入函数中的参数的类型和数量并作出不同的反应来模仿函数的重载。
小结
第三章讲解了ECMAScript中的核心语言特性,因此内容比较多。其实,ECMAScript中的大多数语法都是借鉴自其它类C语言,因此使用方法也是大同小异。但是其中也有一些跟其它语言不同的特性,特别是各种类型的转换,以及操作符用于非数值类型的运算时会有比较大的差异,需要特别注意一下。