美文网首页Javascript高级程序设计 读书笔记
Javascript 基本概念(语句 函数)

Javascript 基本概念(语句 函数)

作者: Sue1024 | 来源:发表于2018-02-01 21:37 被阅读31次

    语句

    if 语句

    if (condition1) {
      statement1 
    } else if (condition2) {
     statement2 
    } else {
    statement3
    }
    

    如果condition1true,执行statement1,如果condition1falsecondition2true,执行statement2, 否则执行statement3
    statement如果只有一行可以不用放在代码块{}中,不过推荐无论何时都使用代码块。
    condition如果不是布尔值,会调用Boolean()将其转化为布尔值

    do-while语句

    先执行后测试循环语句

    do {
      statement
    } while (condition)
    

    可以看出do-while语句,statement会至少执行一次。

    while语句

    while (condition) {
      statement
    }
    

    可以看出statement可能永远都不会执行。

    for语句

    for (initialization; expression; post-loop-expression)  {
      statement
    }
    
    • initialization是循环开始前定义的初始化参数,我们也可以在for语句之前定义好,然后放在这里使用。
    • expression是本次循环是否进行的条件判断语句。
    • post-loop-expression是循环后进行的操作。
    var count = 10;
    var i = 0;
    while (i < count){
      alert(i);
      i++;
    }
    

    等同于

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

    可见for 语句其实就是 while语句的简化版。
    前面提到过i可以在循环外定义:

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

    由于ECMAScript不存在块级作用域,因此在循环内定义的变量,比如i,也可以在外面访问到。
    for语句中,初始表达式,控制表达式和循环后表达式都是可选的

    for (;;) { // 无限循环
    doSomething();
    }
    
    var i = 0;
    for (; i < 10; ){//相当于while
    alert(i);
    i++;
    }
    

    for-in语句

    用来枚举对象的属性,不保证顺序。

    for (var propName in window) {
      document.write(propName);
    }
    

    每次都会将window对象存在的属性名赋给propName,如果要迭代的对象为null or undefined,在ECMAScript 3中会报错,在ECMAScript会不执行循环,因此循环前,最好判断对象是否是null or undefined

    label语句

    label: statement
    

    使用label在代码中添加标签,以便以后会用到。

    continuebreak语句

    break语句用于退出整个循环,即后续满足条件的循环都不会执行。
    continue语句用于退出当前循环,后续满足条件的循环继续执行。
    举两个例子:

    var num = 0;
    for (var i=1; i < 10; i++) {
      if (i % 5 == 0) {
        break;
      }
      num++;
    }
    alert(num); //4
    
    var num = 0;
    for (var i=1; i < 10; i++) {
      if (i % 5 == 0) {
        continue;
      }
      num++;
    }
    alert(num); //8
    

    breakcontinue 语句都可以与label 语句联合使用,用于在指定代码位置发挥作用,多用于循环嵌套。举两个例子:

    var num = 0;
    outermost: for (var i=0; i < 5; i++) {
      for (var j=0; j < 5; j++) {
        if (i == 2 && j == 2) {
          break outermost;//跳出整个循环
        }
        num++;
      }
    }
    alert(num); //5 + 5 + 2 = 12
    
    var num = 0;
    for (var i=0; i < 5; i++) {
      for (var j=0; j < 5; j++) {
        if (i == 2 && j == 2) {
          break;
        }
        num++;
      }
    }
    alert(num); // 22
    
    var num = 0;
    outermost: for (var i=0; i < 5; i++) {
      for (var j=0; j < 5; j++) {
        if (i == 2 && j == 2) {
          continue outermost;//跳出本次循环,继续外层循环
        }
        num++;
      }
    }
    alert(num); //5 * 5 -3 = 22
    
    var num = 0;
    for (var i=0; i < 5; i++) {
      for (var j=0; j < 5; j++) {
        if (i == 2 && j == 2) {
          continue;
        }
        num++;
      }
    }
    alert(num); // 5 * 5 -1 =24
    

    with语句

    with (expression) statement;
    

    with可以将代码的作用域设置到一个特定的对象中,主要是为了简化多次访问同一个对象的操作。

    var name = cat.name;
    var age = cat.age;
    var hobby = cat.hobby;
    

    使用with可以写成:

    with(cat) {
      var name = name; //name首先被认为是局部变量, 如果局部变量没有name,则使用cat对象中的name属性
      var age = age; //age首先被认为是局部变量, 如果局部变量没有age,则使用cat对象中的age属性
      var hobby = hobby; // hobby首先被认为是局部变量,如果局部变量没有hobby,则使用cat对象中的hobby属性
    }
    

    严格模式下不能使用with

    由于大量使用with 语句会导致性能下降,同时也会给调试代码造成困难,因此
    在开发大型应用程序时,不建议使用with 语句。

    switch语句

    switch (expression) {
      case value1: 
        statement1
        break;
      case value2: 
        statement2
        break;
      case value3: 
        statement3
        break;
      default: 
        statement4
    }
    

    等价于

    if (expression == value1){
      statement1
    } else if (expression == value2) {
      statement2
    } else if (expression == value3) {
      statement3
    } else {
      statement4
    }
    

    当然我们也可以省略break关键字,用于合并几种情形,比如:

    var num = 2;
    switch(num) {
        case 1:
            console.log("1");
        case 2: 
            console.log("2");
        case 3:
            console.log("3")
        default:
            console.log("default");
            break;
    }
    //打印出 2 3 default
    

    如果匹配到的情形中没有break,会继续执行下面的情形中的语句,直至遇到break或语句结束。
    switch语句中可以使用任何数据类型,case可以使用常量、变量或表达式,比如:

    var attr_me = 'Sue';
    var name_brother = 'Ben';
    switch(attr_me ) {
        case 'Su' + 'e':
            console.log("It is my name.");
            break;
        case 18: 
            console.log("It is my age.");
            break;
        case name_brother :
            console.log("It's my brother");
            break;
        default:
            console.log("default");
            break;
    }
    

    switch在比较时用的是全等操作符。
    书中还提到了比较巧妙的使用方法,switch语句使用布尔值,case就可以使用各种可以返回布尔值得操作符或方法。

    switch(true) {
        case 2 === 3:
            console.log("2===3");
            break;
        case 2 < 3:
            console.log("2 < 3");
            break;
        default:
            break;
    }
    

    函数

    function functionName(arg0, arg1,...,argN) {
      statements
    }
    

    参数

    ECMAScript中定义函数时,我们有的时候会定义一些这个函数需要外界传入的参数,需要注意的是,调用一个函数时,传入或不传、传几个,解析器都不会在意,因为最终解析器会把他们打包进一个参数数组中,我们可以在函数中通过arguments获得这个数组,这个数组里的值会按顺序映射到我们定义的命名参数中,于是我们就可以通过命名参数获得用户传来的参数。
    如果开发者需要通过用户输入的参数个数为用户提供不同的功能:

    function operation() {
      if(arguments.length === 0) return;
      if(arguments.length === 1) return arguments[0];
      if(arguments.length === 2) return arguments[0] + arguments[1];
    }
    
    operation(); // undefined
    operation(3); // 3
    operation(1, 2); // 3
    

    有点像方法重载。
    arguments中的值永远与命名参数的值保持同步,举个例子:

    function test(num) {
      console.log(num);
      num++;
      console.log(arguments[0]);
    }
    
    test(3); // 3 4
    

    虽然arguments中的值与命名参数的值是同步的,但他们的内存空间是独立的,访问它们并不是在访问同一个内存空间,那些没有传入值的命名参数值为undefined

    function test(num1, num2) {
      console.log(num1, num2);
    }
    
    test(3); // 3 undefined
    

    ECMAScript只有传值,没有传引用。严格模式下,不能修改arguments,会抛出错误。

    没有重载

    由于ECMAScript并不在意以一个函数定义了哪些命名参数,因此,名字相同,参数却不同的几个函数在ECMAScript的认知中,只是同一个函数被定义了多次,最后一个函数会将前面定义的覆盖掉。

    function add(num) {
      return num++;
    }
    function add(num1, num2) {
      return num1 + num2;
    }
    add(8); // NaN
    

    但我们可以参照前面说的方法模仿重载。

    返回值

    ECMAScript 中的函数在定义时不必指定是否返回值。实际上,任何函数在任何时候都可以通过return 语句后跟要返回的值来实现返回值,当执行到return时,立刻退出函数,如果return后不指名返回值,将返回undefined

    相关文章

      网友评论

        本文标题:Javascript 基本概念(语句 函数)

        本文链接:https://www.haomeiwen.com/subject/uwnlzxtx.html