语句
if语句
- if的条件结果并不一定是布尔值,js会自动调用Boolean()转换函数来将这个表达式的结果转换为布尔值。
do-while语句
后测试循环语句,循环体内的代码至少会被执行一次。
while语句
前测试循环语句
for语句
前测试循环语句。
- 使用while循环做不到的,使用for循环也做不到
- 如果将for语句的初始化表达式、控制表达式和循环后表达式全部省略,就会创建一个无限循环。
for-in语句
是一种精准的迭代语句,可以用来枚举对象的属性。
- ECMAScript对象的属性没有顺序,因此通过for-in循环输出的属性名的顺序是不可预测的,返回的先后顺序可能会因浏览器而异。
label语句
在代码中添加标签以便将来使用。一般由break和continue语句引用。
break和continue语句
用于在循环中精确的控制代码的执行。
- break会立即退出循环,强制执行循环后面的语句。
- continue语句也会立即退出循环,但退出循环后会从循环的顶部继续执行。
- break与continue语句都可以与label语句联合使用,从而返回代码中特定的位置。这种联合使用的情况多发生在循环嵌套的情况下。
var num = 0;
outermost:
for(var i=0;i<10;i++){
for(var j=0;j<10;j++){
if(i==5 && j==5){
break outermost;
}
num++;
}
}
alert(num); //55,此标签导致break不仅退出内部循环,也退出外部循环
var num = 0;
outermost:
for(var i=0;i<10;i++){
for(var j=0;j<10;j++){
if(i==5 && j==5){
continue outermost;
}
num++;
}
}
alert(num); //95,此标签导致continue会退出内部循环,继续执行外部循环,这就意味着内部循环少执行5次,因此是95
with语句
将代码的作用域设置到一个特定的对象中。目的主要是为了简化多次编写同一个对象的工作。
with(location){
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
像search,hostname和href,会被认为是一个局部变量,如果在局部环境中找不到该变量的定义,就会查询location对象中是否有同名的属性。如果发现了同名属性,则以location对象属性的值作为变量的值。
- 严格模式下不允许使用with语句。
- 大量使用with语句会导致性能下降,也会给调试带来困难,因此不建议使用。
switch语句
- switch在比较时使用的是全等操作符,因此不会发生类型转换。
函数
- return语句可以不带任何返回值,这种情况下函数在停止执行后将返回undefined。
- 严格模式对函数有一些限制
- 不能把函数命名为eval或arguments
- 不能把参数命名为eval或arguments
- 不能出现两个命名参数同名的情况
有关参数
ECMAScript函数不介意传递进来多少个参数,也不在乎传递进来的参数是什么数据类型。即便定义函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数,可以传递一个,三个或不传。原因是ECMAScript中的参数在内部是用一个数组表示的,函数接收到的始终是这个数组。在函数体内可以通过arguments对象来访问这个参数数组。
- arguments对象并不是数组,只是与数组类似。可以使用方括号下标访问每一个元素,也可以用length属性确定传递进来多少个参数。因此函数内部也可不显式地使用命名参数,利用arguments来访问参数。
function sayHi(){
alert("hello" + arguments[0] + "," + arguments[1]);
}
- ECMAScript函数的特点:命名的参数只是提供便利,但不是必需的。
- 在函数内部访问arguments.length可以知道有多少个参数传递给了函数
- arguments对象可以与命名参数一起使用
function doAdd(num1,num2){
alert(arguments[0]+num2);
}
- arguments的值永远与对应命名参数的值保持同步
function doAdd(num1,num2){
arguments[1] = 10;
alert(arguments[0]+num2);
}
每次执行这个函数都会重写第二个参数,将第二个参数改为10,因为arguments对象中的值会自动反映到对应的命名函数,所以修改了arguments[1]就等于修改了num2 。但是arguments与num2的内存空间是独立的,但它们的值会同步。
- arguments对象的长度是由传入的参数个数决定的,而不是由定义函数时的命名参数的个数决定的
- 没有传递值的命名参数值为undefined。
- 严格模式中不会发生前面的更改arguments[1],num2也跟着改变的情况,此时num2还是undefined。
- ECMAScript中所有参数传递的都是值,不可能通过引用传递参数。
没有重载
由于ECMAScript函数没有签名(接收的参数的类型和数量),因此无法像java一样做到重载。
- 如果定义了两个名字相同的函数,则该名字只属于后定义的函数。
- 通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿方法的重载。