javascript学习笔记——语句

语句就是javascript整句和命令。

表达式语句:

count++; alert(123); a = 100; .......

复合语句和空语句:

复合语句就是用逗号将多个语句连在一起形成复合语句。{x=1;y=2;alert(x);alert(y)}

ps:在javscript中没有块级作用域,只有函数作用域。

空语句包含0条语句,在部分时候也是有用的。

如for(var i = 0; i < 3 ; a[i++] =0);在这里最后是一个分号,会执行for循环括号里面的语句。

声明语句:

var 声明一个变量。

假如var声明在一个函数作用域内,那么这个变量就是局部作用域。

ps:变量在函数作用域中有提前声明的问题

window.onload = function(){
    var b = "hello world";
    function a(){
        console.log(b);  //变量提前声明,undifined
        var b = "world hello";  //由于变量b在这里定义了,所以导致变量提前声明
        console.log(b);
                    
    }
    console.log(b);
    a();
}

在上面的代码中,函数a中先输出b,但是b并没有在之前声明,但是在b之后有声明b=“world hello",根据变量在函数作用域提前声明的规则,那么var = b会提前到函数块的最顶上,所以第一个console.log(b)为undifined。

function 定义函数,必须使用花括号,即使是一条语句,不可省略花括号。

var a = function(){} 函数定义表达式方式

function a(){} 函数声明方式

这两种定义函数的方式是有区别:

第一种表达式方式在定义之后,var声明的变量会提前到作用域的顶部,但是函数块还在原来的地方,所以假如在函数块之上调用函数就会报错。

第二种函数声明方式在声明之后,变量和函数块都会提前到作用域的顶部,可以做作用于上下文,所以在函数块之上调用函数可以正常使用。

window.onload = function(){
                alert(b());   //"world hello"
                alert(a());   //Uncaught TypeError: a is not a function
                
                //函数表达式中,只有变量声明被提前了,变量初始化代码依旧还在原来的位置
                var a = function(){
                    return "hello world";
                }
                
                //函数声明语句,函数名称和函数体都提前了,可以在声明之前调用它
                function b(){
                    return "world hello"
                }
            }

条件语句:

if else if switch

if(expression) statement if里面的expression必须要写,statement也是必须要写的语句。

switch可以处理多条分支的情况

switch(expression){

case (expression) :

statement;

break;

...........

default :

statement;

break;

}

在switch中假如没有break,那么语句会一直执行直到switch最后一条语句。

在函数中可以中return代替break。

case的匹配是使用"==="进行比较的,所以匹配的时候不会进行类型的转换。

switch的比较是从上到下的,default可以放到任何一个位置的。

循环

while do/while for for/in

do/while至少执行一次的循环,do是先执行语句,然后在通过while去进行判断

for/in是用来遍历一个对象的属性的

for(variable in object),即使object是一个原始值,也会转换成包装对象来遍历的。

但是遍历也是有条件的,只能遍历可枚举的属性,而javascript核心方法和对象属性都是不可枚举的,所以在遍历的时候这些都没有办法遍历出来,而自己定义的对象属性和方法就可以遍历出来。

如果for/in的循环体在还没有遍历到某属性的时候就删除了,那么这个属性就不会再获取到;如果for/in循环体中增加了一个某属性,那么它也不会被获取到。

属性枚举的顺序,一般来说通过属性定义的先后顺序来枚举的。