Javascript高级程序设计 Ch3
基本概念
3.6语句
1. if 语句
语法:
if (condition) {
statement1
}else if{
statement2
}else {
statement3
}
2. do - while 语句
语法:
do {
statement
}while(expression);
像 do - while 这种后测试循环语句最常用于循环体中的代码至少要被执行一次的情形。
3. while 语句
语法:
while(expression) {
statement
}
4. for 语句
语法:
for (initialization; expression; post-loop-expression) {
statement
}
由于 for 语句存在极大的灵活性,因此它也是ECMAScript中最常用的一个语句。
5. for - in 语句
语法:
for (property in expression) {
statement
}
如果表示要迭代的对象的变量值为 null 或 undefined, for - in 语句会抛出错误。ES5更正了这一行为,对这种情况不再抛出错误,而只是不执行循环体。为了保证最大限度的兼容性,建议在使用 for - in 循环之前,先检测缺人该对象的值不是 null 或 undefined。
6. label 语句
语法:
label: statement
使用label语句可以在代码中添加标签,**以便将来(break 和 continue)使用**
7. break 和 continue 语句
break 和 continue 语句用于在循环中精确地控制代码的执行。他们都会立即退出循环,但是,break 语句会立即强制继续执行循环后面的语句,而 continue 语句则会从循环的顶部继续执行,也就是忽略掉循环体中 continue 后的语句。
break 和 continue 语句都可以和 label 语句联合使用,从而返回到代码中特定的位置(标签处),这种联合的使用情况多使用于循环嵌套的情况下
8. with 语句
语法:
with (expression) {
statement
}
作用是将代码的作用域设置到一个特定的对象中。严格模式下不允许使用 with 语句,另一方面,大量的使用 with 语句会导致性能下降,同时也会给调试代码造成困难,因此不建议使用 with 语句
9. switch 语句
语法:
switch (expression) {
case value:
statement;
break;
case value:
statement;
break;
default value:
statement;
}
通过为每个 case 后面添加一个 break 语句,就可以避免同时执行多个 case 代码的情况。假如确实需要混合几种情况,最好是在代码中添加注释,说明你是有意省略了 break 关键字
另外 switch 语句中可以使用任何数据类型
3.7 函数
通过函数可以封装任意多条语句,而且可以在任何地方、任何时候调用执行。用 function 关键字来声明,后跟一组参数以及函数体。
语法:
function functionName(arg0, arg1,...,argN) {
statements;
}
任何函数在任何时候都可以通过 return 语句后跟要返回的值来实现返回值。
函数会在执行完 return 语句之后停止并立即退出,因此位于 return 后的任何代码都不会执行。
严格模式下对函数有一些限制:
1. 不能把函数命名为 eval 或 arguments;
2. 不能把参数命名为 eval 或 arguments;
3. 不能出现两个命名参数同名的情况。
1. 理解参数
ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组内包含哪些参数。实际上,在函数体内可以通过 arguments 对象来访问这个参数数组,从而获取传递给函数的每一个参数。arguments 对象只是与数组类似(它并不是 Array 的实例),因为可以使用方括号语法访问它的每一个元素(第一个是 arguments[0], 第二个是 arguments[1], 依此类推)。
命名的参数只是提供便利,不是必须的。
arguments 对象可以与命名参数一起使用。
严格模式下对如何使用 arguments 对象作出了一些限制:
- 首先,赋值会变的无效,即使我们把 arguments[1] 设置为 10, num2 的值如果没有赋值的话依然会是 undefined;
- 其次,重写 arguments 的值会导致语法错误。(代码将不会执行)
2. 没有重载
在其它语言中(如Java),可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。但 ECMAScript 函数没有签名,所以也就不可能做到正真的重载。
不过,通过检查传入函数中参数的类型(valueOf)和数量(length)并作出不同的反应,可以模仿方法的重载。