JavaScript高级程序设计(3)基本概念 下
语法:通常使用一或多个关键字来完成给定任务。
if语句:
条件可以是任意表达式;而且对这个表达式求值的结果不一定是布尔值。ECMAScript会自动调用Boolean()转换函数将这个表达式的结果转换为一个布尔值。如果求值结果为true,则执行语句1,如果求值结果是false,则执行语句2。这两个语句既可以是一行代码,也可以是一个代码块(一对花括号括起来的多行代码)
if(i > 25) { alert("Great than 25."); //单行语句 } else { alert("Less than or equal to 25."); //代码块中的语句 }
即使只有一行代码,也要始终使用代码块。
do-while语句:
后测试循环语句:对表达式求值之前,循环体内的代码至少会被执行一次。
var i = 0; do{ i += 2; }while(i < 10); alert(i);
while语句:
前测试循环语句:循环体内的代码有可能永远不会被执行。
var i = 0; while(i < 10){ i += 2; } alert(i);
for语句:
前测试循环语句:但是它具有执行循环之前初始化变量和定义循环后要执行的代码的能力。也有可能不会执行循环体中的代码。
var count = 10; //var i; for(var i = 0; i < count; i++) //循环变量初始化语句; 循环条件; 改变循环变量的语句 { alert(i); //循环体 } alert(i) //10
循环变量初始化语句是可以省略的;也可以初始化多个值; 初始化循环中所用的变量
循环条件是可以省略的;但是必须在循环内提供break; 评估初始变量的条件
改变循环变量的语句是可以省略的,增量可以是负数或者更大 增加初始变量的值。
如果全都省略,就会创建一个无限循环。
使用while循环做不到的,使用for循环同样也做不到。
for循环的变量初始化语句,可以不使用var关键字,在外部执行。
即使 i 是在循环内部定义的一个变量,但是在循环外部任然可以访问到它。
for-in语句:
一种精准的迭代语句,可以用来枚举对象的属性。
for (var propName in window) { document.write(propName); }
这个例子中,使用for-in循环来显示了BOM中的window对象的所有属性。每次执行循环时,都会将window对象中存在的一个属性名赋值给变量propName。这个过程会一直持续到对象中的所有属性都被枚举一遍为止。
ECMAScript对象的属性没有顺序,通过for-in循环输出的属性名的顺序是不可预测的。具体来讲,所有属性都会被返回一次,但是返回的先后次序可能回因浏览器而异。
如果迭代的对象的变量值为null或undefined,for-in语句会抛出错误。不再执行循环体。
label语句:
可以在代码中添加标签,以便将来使用。
start:for(var i = 0; i < count; i++) { alert(i); }
这个例子定义的start标签可以在将来由break或continue语句应用。加标签的语句一般都要与for语句等循环语句配合使用。
break和coutinue语句:用于循环中精确地控制代码的执行。
break语句会立即退出循环,执行循环后面的语句;
continue语句也是立即退出循环,但退出循环后会从循环的顶部继续执行;
var num = 0; var num = 0; for(var i=1; i<10; i++) for(var i=1; i<10; i++) { { if(i % 5 == 0) if(i % 5 == 0) { { break; continue; } } num++; num++; } } alert(num); /*4*/ alert(num); //8
break和continue语句都可以与label语句联合使用,从而返回代码中特定的位置。这种联合使用的情况多发生在循环嵌套的情况下。
var num = 0; var num = 0; outermost: outermost: for(var i=0; i<10; i++) for(var i=0; i<10; i++) { { for(var j=0; j<10; j++) for(var j=0; j<10; j++) { { if( i==5 && j ==5) if( i==5 && j ==5) { { break outermost; continue outermost; } } num++ num++ } } } } alert(num);/*55*/ alert(num);//95
建议如果使用label语句,一定要使用描述性的标签,同时不要嵌套过多的循环。
with语句:看书了解,不建议使用不详述。
switch语句:
swith语句与if语句的关系最为密切,而且也是在其他语言中普遍使用的一种流控制语句。
switch (expression) case value: statement; break; case value: statement; break; case value: statement; break; case value: statement; break; ... case value: statement; break; default: statement;
每个情况(case)都是表示“如果 expression 等于 value,就执行 statement”。
关键字 break 会使代码跳出 switch 语句。如果没有关键字 break,代码执行就会继续进入下一个 case。
关键字 default 说明了表达式的结果不等于任何一种情况时的操作(事实上,它相对于 else 语句)。
可以在switch语句中使用任何数据类型,字符串和对象都可以。每个case的值都不一定是常量,可以是变量。甚至是表达式。
switch语句在比较值时使用的是全等操作符,因此不会发生类型转换。(字符串 "10" 不等于数值10)。
函数:
通过函数可以封装任意多条语句,而且可以在任何地方任何时候调用执行。ECMAScript中的函数使用function关键字来声明,后跟一组参数以及函数体。
函数可以通过其函数名来调用,后面还要加上一对圆括号和参数(圆括号中的参数如果有多个,可用逗号隔开)。
任何函数在任何时候都可以通过return语句后跟要返回的值来实现返回值。函数执行完return语句之后停止并立即退出。
未指定返回值的函数返回的是一个特殊的undefined值。
要么函数始终都返回一个值,要么永远都不要返回值。不然函数有时候返回值,有时候又不返回值,会给调试代码带来不便。
参数:
ECMAScipt不介意传递进来多少参数,也不在乎参数是什么数据类型。并且可以通过arguments对象来访问这些参数。
没有传递值的命名参数将自动被赋予undefined值。
ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。
没有重载:由于不存在函数签名的特性,ECMAScript函数不能重载。