大部分都是基础知识,只记录一下需要注意和之前不了解的点
语句
1. if
- 推荐即使只有一行也使用代码块,增加代码可读性。
2. do-while / while
3. for
- 因为 ECMAScript 中不存在块级作用域,所以循环内部定义的变量也可以外部访问到。
4. for-in
语法: for (property in expression) statement
示例:
for (var propName in window) {
document.write(propName);
}
- for-in 语句是一种精准的迭代语句,可以用来枚举对象的属性。
- ECMAScript 对象的属性没有顺序。因此,通过 for-in 循环输出的属性名的顺序是不可预测的。
5. label
使用 label 语句可以在代码中添加标签,以便将来使用。
语法:label: statement
示例:
start: for (var i=0; i < count; i++) {
alert(i);
}
- 上述例子中定义的 start 标签可以在将来由 break 或 continue 语句引用。
- 加标签的语句一般都与 for 语句等循环语句配合使用。
6. break 和 continue
- break 会立即退出循环,强制继续执行循环后面的语句。
- continue 也是立即退出循环,但是退出循环后会从循环的顶部继续执行。
- break 和 continue 都可以与 label 语句联合使用,从而返回代码中特定的位置。
7. with
with 语句的作用是将代码的作用域设置到一个特定的对象中。
定义 with 语句的目的主要是简化多次编写同一个对象的工作。
语法:with (expression) statement;
示例:
// 不使用 with 语句
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
// 使用 with 语句
with(location) {
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
在 with 语句的代码块内部,每个变量首先被认为是一个局部变量,而如果在局部变量中找不到改变量的定义,就会查询 location 对象中是否有同名的属性。如果发现同名属性,则以 location 对象属性的值作为变量的值。
- 严格模式下不允许使用 with 语句,否则将视为语法错误。
- 大量使用 with 语句会导致性能下降,同时会给代码调试带来困难,因此在开发大型应用程序时,不建议使用 with 语句。
8. switch
switch 语句也是其他语言中普遍使用的一种控制流语句,语法也与 c 语言类似。
语法:
switch (expression) {
case value: statement
break;
case value: statement
break;
case value: statement
break;
default: statement
}
- ECMAScript 中的 switch 语句中可以使用任意数据类型(在很多其他语言中只能使用数值),无论是字符串还是变量都没有问题。
- 每个 case 的值不一定是常量,也可以是变量,甚至是表达式。
- switch 语句在比较值时使用的是全等操作符,因此不会发生类型转换(例如,字符串“10”不等于数值10)。
函数
函数基本语法:
function functionName(arg0, arg1, ..., argN) {
statement
}
- ECMAScript 中的函数在定义时不必指定是否返回值。实际上,任何函数在任何时候都可以通过 return 语句来返回值。
理解参数
ECMAScript 函数的参数与大多数其他语言中函数的参数有所不同。ECMAScript 函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数,在调用这个参数时也未必一定要传递两个参数。
之所以会这样,是因为 ECMAScript 中的参数在内部是用一个数组来表示的,函数接收到的始终是这个数组。实际上,在函数体内部可以通过 arguments 对象来访问这个参数数组,从而获取传递给函数的每一个参数。
ECMAScript 函数的一个重要特点:命名的参数只提供便利,但不是必须的。
其实,arguments 对象只是与数组类似(并不是 Array 的实例),因为可以使用方括号语法访问它的每一个元素,使用 length 属性来确定传递进来多少个参数。
开发人员可以利用这一点让函数能够接受任意个参数并分别实现适当的功能。例如:
function doAdd() {
if(arguments.length == 1) {
alert(arguments[0] + 10);
} else if (arguments.length == 2) {
alert(arguments[0] + arguments[1]);
}
}
doAdd(10); // 20
doAdd(30, 20); // 50
关于 arguments 的行为,还有一点比较有意思。那就是它的值永远与对应命名参数的值保持同步。例如:
function doAdd(num1, num2) {
arguments[1] = 10;
alert(arguments[0] + num2);
}
因为 arguments 对象中的值会自动反映到对应的命名参数,所以修改了 arguments[1],也就修改了 num2,结果他们都会变成 10。但并不是说读取这两个值会访问相同的内存空间;他们的内存空间是独立的,但是值是同步的。
另外:没有传递值的命名参数将自动被赋予 undefined 值,就跟定义了变量但没有初始化一样。
ECMAScript 中的所有参数传递的都是值,不可能通过引用传递参数。
没有重载
ECMAScript 函数不能像传统意义上的那样实现重载,如果定义了两个名字相同的函数,则该名字只属于后定义的函数。如前所述,通过检查传入函数中的参数类型和数量并作出不同的反应,可以模仿方法的重载。