Javascript 高级编程 3章54页 【语句】

141 阅读1分钟

if 语句

if (condition) statement1 else statement2
  • condition 不一定是布尔值,ECMAScript会自动调用Boolean()将其转换为一个布尔值
  • statement 可以放在花括号里,也可以不。但推荐放在花括号里即使只有一行代码
  • 甚至,可以将整个if语句写在一行里,但不推荐这样写

do-while语句

do {
    statement
} while (expression)
  • 后测试循环语句
    • 在循环体中的代码被执行后,才会测试出口条件
var i = 0;
do {
    i += 2;
} while (i < 10);

alert(i);

while语句

while(expression) statement
  • 前测试循环语句
var i = 0;
 while (i < 10) {
   i += 2;
 }

for语句

for (initialization; expression; post-loop-expression) statement
  • 前测试循环语句
  • 能够在执行循环前,初始化变量
  • 能够在执行循环前,定义循环后要执行的代码
  • 使用while循环做不到的,使用for循环同样做不到。for循环只不过是把与循环有关的代码集中在了一处

ECMAScript没有块级作用域,因此循环内定义的变量,循环外也可以访问

var count = 10;
for (var i = 0; i < count; i++) {
    alert(i);
}
alert(i);   //可以访问 i


//initialization不是必须带着 var
var count = 10;
var i;
for (i = 0; i < count; i++) {
    alert(i);
}


//都缺省,就是无限循环
for (;;) {
    DoSomething();
}

等价的while写法:

var count = 10;
var i = 0;
while (i < 10) {
    alert(i);
    i++;
}

for-in 语句

for (property in expression) statement
  • 是一种精准迭代语句,可以用来枚举对象的属性
    • ECMAScript的对象属性没有顺序,所以for-in输出的属性其顺序也不可预测,可能因浏览器而异
  • var不是必须的,但是为了保证使用局部变量,推荐使用var
  • 要迭代的值为nullundefined时, for-in 语句会抛出错误
    • 但ECMAScript 5更正了上述行为:不再抛出错误,只是不执行循环体
    • 为了最大限度保证浏览器兼容性,建议使用for-in环前,先确认迭代的值是不是nullundefined
// 遍历 BOM 中 window对象 的所有属性
for (var propName in window) {
    document.write(propName);
}

label 语句

label : statement
  • 在代码中添加表情,以便将来由breakcontinue语句引用
  • 加标签的语句,一般都要与for语句等循环语句配合使用
start: for (var i=0; i < count; i++) {
    alert(i);
}

break和continue 语句

  • break, 直接跳出循环
  • continue, 回到循环顶部继续执行
  • breakcontinue都可以和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
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

with 语句

  • 将代码的作用域设置到一个特定的对象中
  • 目的是为了简化多次编写同一个对象的工作
  • with语句的内部, 对于每个变量
    • 首先认为是局部变量
    • 局部环境中找不到该变量的定义,就认为是对象的属性
  • 严格模式下,不允许 使用with语句,否则视为语法错误
  • 大量使用with语句,会导致性能下降和调试困难

开发大型应用程序时,不建议使用with语句

//使用with语句简化前
var gs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;

//使用with语句简化后
with(location)
{
    var gs = search.substring(1);
    var hostName = hostname;
    var url = href;
}

switch 语句

  • ECMAScript中的switch语句借鉴自其他语言,但也有自己的特色
    • switch语句中,可以使用任何数据类型
    • case的值可以是:
      • 常量
      • 变量
      • 表达式
    • 比较的时候使用全等操作符,因此不会发生类型转换
switch ("hello world") {
    //case 这里,是一个表达式
    case "hello" + "world":
        alert("Greeting was found");
        break;
    case "goodbye":
        alert("Closing was found");
        break;
    default:
        alert("Unexpected message was found");
}
//看哪个分支为true
switch (true) {
    //case 这里,是表达式
    case num < 0:
        alert("Less than 0");
        break;
    case num >=0 && num <= 10:
        alert("Between 0 and 10");
        break;
    case num > 10 && num <= 20:
        alert("Between 10 and 20");
        break;
    default:
        alert("More than 20");
}