深究js(六)——浅谈语句(语句Ⅰ)

        在JavaScript中,语句的作用是告诉浏览器该做什么,相当于一个指令。一条语句通常都是以分号来结尾的。在JavaScript中,比较常见的语句有表达式语句、复合语句、空语句、声明语句、条件语句、循环语句、跳转语句还有其他的一些语句。语句这个篇章我打算分五个部分来讲,这个是第一部分。下面我来讲循环语句之前的所有语句。

一、表达式语句

        何为表达式语句。就是使某件事发生的一个方法是计算带有副作用的表达式,比如说赋值和函数调用这些有副作用的表达式。常见的赋值类型的语句,如:

var a = 1;
        这个就是一条语句。再如其他的一些运算符组成的表达式也可以成为一条语句,如“++”、“--”等运算符。或者可以通过函数调用的方式来得到一条语句,如:

alert(a);
        alert()函数是window对象里的一个属性,在这里也属于一条语句。


二、复合语句

        在之前的文章中,讲到表达式的时候有复杂表达式,复杂表达式就是通过多个逗号来形成的。而在这里,复合语句通过多个“;”和一对花括号来组成,通常这样子组成会形成一个语句块。如:

{
    x = 1;
    y = 2;
}
        常见的语句块比如条件语句、函数表达式等等。在语句块中,子语句的结尾必须有分号,并且,这个语句块是没有块级作用域,除了某些特定的,如函数表达式。当然,可能你第一眼看见语句块的时候,会以为这个好像对象字面量。其实这两个东西还是有区别的。如下面这个就是一个对象字面量:

({toString:function(){return "hehe"}}) + "...";
        在这里,对象字面量通过括号括起来來控制它的范围,当运行时,因为加号的缘故,所以这个对象字面量会转换成字符串,所以在控制台会返回“here,,,”这个东西出来。但是如果是这样的话;

{toString:function(){return "hehe"}}
        在控制台运行时就会报错,虽然好像有toString这个变量名,但是它本身变量名,它只是一个标签,关于标签下面会讲到,这里先不讲。并且这条语句里,函数声明语句没有函数名,也没有赋值给一个变量,所以它会报错。正确的做法是:

{toString:function f(){return "hehe"}}    //或者下面的
{toString:var a = function () {return "here"}}
        函数声明语句会在等一下讲到。现在讲的是空语句。


三、空语句

        空语句比较简单,什么都不写,只需加一个分号就可以了。如:

;
        这个我们一般用在循环语句中,因为在JavaScript中,循环体必须至少包含一条语句,当不想写表达式的时候,就可以通过这样来完成一个语句,如;

for (i = 0; i<a.length; a[i++] = 0) ;
        这样就不会报错。


四、声明语句

        在声明语句中,通常有用var和function声明的,它们声明或定义变量或函数。这些语句定义标识符(变量名和函数名)并赋值,这些标识符可以在程序的任何地方使用。下面我们来讲一下var和function。

        var语句可以用来声明一个或多个变量,如:

var a = 1;
        如果声明的变量在函数体内,则这个变量是局部变量,它的作用域就是这个函数。如果在顶层代码中声明,则是全局变量,全局变量是全局对象的属性。var声明的变量是不能用delete操作符删除的。当用var声明了一个变量但是没有赋值,则初始化的值是underfined。var声明的变量会提前到脚本或者函数的顶部,这个在之前有讲过,称为声明提前,但是也只是它的声明提前,它的赋值不会提前,只会运行到赋值的时候变量才会得到新值。值得注意的是,多次声明同一个变量只会调用最后声明的变量。

        关键字function是用来定义函数,但除此以外也可以写成语句,常见的函数语句有两种写法,一种是写一个匿名函数将其赋给一个变量,另一个是function加函数名加小括号加花括号,这两种写法如下所示:

var a = function () {
    return "a"
}
function b() {
    return "b"
}
        小括号是参数列表,在外部调用的时候可以填入实参,然后函数内可以使用这些参数。在定义函数的时候,并不执行函数体内的语句,它和调用函数时待执行的新函数对象相关联。比如上面的例子中,可以在代码后面加上a()和b()语句就可以执行a函数和b函数。现在有一个思考,仍然以上面代码为例子,如果我调用a、b函数都是在这两个函数之前,会发生什么样的结果呢?代码如下:

alert(a)
alert(b())
var a = function () {
    return "a"
}
function b() {
    return "b"
}
        我们运行这个代码可以看到,第一个语句输出的是underfined,第二个输出的是b,这是为什么呢?原来我们用var声明一个函数的时候,只是它的变量提前了,但是变量初始化的代码没有提前,也就是说,在执行到第三行代码前,变量a还是underfined。但是函数b就不同了,函数b的函数名是一个变量名,这个变量名指向的是函数对象,所以它的变量声明提前,他的整个代码也提前了,提前到脚本或者函数的顶部,因此在整个脚本或者函数内可见。


五、条件语句

        条件语句是通过判断指定表达式的值来决定执行还是跳过某些语句,这些语句是代码的“决策点”,有时称为“分支”。常见的有“if”、“else if”和“switch”,下面慢慢介绍。

        if语句是一种基本的控制语句,让程序可以选择执行的路径。一般有两种写:

if (expression)
    statement
//或者下面
if (expression)
    statement1
else 
    statement2
        expression是表达式,当表达式里的值为真的时候,才会执行statement,否则则跳过if,有else语句则执行else语句,没有则执行下一句代码。常见的假值有:null、underfined、false、0、空字符串和NaN。注意,if关键字和带圆括号表达式后面必须跟随一条语句,如果只有一条语句,可以不加花括号,否则则要加花括号。else语句的匹配规则是就近与if语句匹配,下面是个错误的例子:

i = j = 1
k = 2
if (i == j)
    if (j == k)
        console.log("1")
else
    console.log("2")
        可能有些人以为答案是没有东西输出,但是认真的发现,结果是2。这是因为else会就近的与if语句匹配,在机器眼里,这段代码是这样的:

if (i == j) {
    if (j == k)
        console.log("1")
    else
        console.log("2")
}
        所以关键的时候还是要用花括号来隔开,从而让代码层次更加的清晰。

        除此以外还有else if语句。else if语句在后面的圆括号内写判别的表达式,同if语句差不多else if语句同上面的if语句通常是合在一起用,如:

if (expression)
    statement1
else if (expression)
    statement2
else
    statement3
        用法和if语句没太大区别,这里不详细讲。

        最后讲一个switch语句。当所有的分支都依赖于同一个表达式的值时,我们可以不用else if这么繁琐,我们可以用switch语句。switch语句后面的圆括号写的是表达式,在代码块内,有多个case和一个default,case后面跟的是一个值,当表达式的值等于case后面的值时,则执行这条语句,之后break跳出switch,否则则在默认default中跳出,如:

switch (n) {
    case 1:
        console.log(1)
        break
    case 2:
        console.log(2)
        break
    case 3: 
        console.log(3)
        break
    default:
        console.log(0)
        break
}
        这里关于switch语句有几点是需要提的。第一是switch表达式的值与case的值比较的运算符是恒等于号,也就是说比较的时候不会发生类型转换。第二是每个case语句和default语句的结尾处一定要加上break,不然会一直执行后面的代码。第三,如果switch中没写default语句,则整个表达式中没有符合的值话,会直接跳出整个switch。default语句是最后执行的,所以即使default语句写在最前面也不影响。最后要说的是,由于JavaScript的switch语句的运行原理和java、c++的不同,JavaScript的case表达式的值是在运行时计算的,所以JavaScript的switch语句的效率非常的低,能不用的时候尽量避免使用。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值