JavaScript颠覆其他语言的地方

博主最近刚刚开始踏踏实实的看JavaScript权威指南,现在将这个过程中,那些让我毁三观的语法一一记录。

可选的分号

和其他编程语言一样,JavaScript使用分号(;)将语句分隔开。这对增强代码的可读性和整洁性非常重要:缺少分隔符,一条语句的结束将成了下一条语句的开始。在JavaScript中,如果语句各自独占一行,通常可以省略语句之间的分号。
需要注意的是,JavaScript并不是在所有换行处都填补分号:只有在缺少了分号,就无法正确解析代码的时候,JavaScript才会填补分号。也就是说,如果当前语句和随后的非空格字符不能当成一个整体来解析的时候,JavaScript就在当前语句行结束处填补分号。如下代码:

var a
a 
=
3
console.log(a)

JavaScript将会将其解析为:var a;a=3;console.log(a); JavaScript给第一行还行出添加了分号,因为如果没有分号,JavaScript将无法解析代码var a a。第二个a可以单独当作一条语句a;,但是JavaScript并没有给第二行结尾填补分号,因为它可以和第三行内容拼接成a=3;
这些语句的分隔规则会导致一些意想不到的情形,这段代码写成了两行,看起来是两条独立的语句:

var y=x+f
(a+b).toString()

但第二行的圆括号却和第一行的f组成了一个函数调用,JavaScript会把这段代码看作:var y=x+f(a+b).toString(); 而这段代码的本意并不是这样的。因此,在编程的过程中,还是使用分号来作为每行的结束。

数字

和其他编程语言不同,Javascript不区分整数值和浮点数值,所有的数字均用浮点数值表示。JavaScript中的非数字值有一点特殊:它和任何值都不相等,包括自身。也就是说,没办法通过x==NaN来判断变量x是否是NaN。不过可以x!=x判断,当且仅当x为NaN的时候,表达式的结果才为true。

变量

在JavaScript程序中,使用一个变量之前,应该先声明。变量是使用关键字var来声明的。和C或Java不一样,在JavaScript的变量声明中,并没有指定变量的数据类型。变量可以是任意的数据类型。
使用var语句重复声明变量是合法且无害的,如果重复声明带有初始化器,那么这就和一条简单的赋值语句,没什么两样。

作用域

在一些类似C语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的,我们称之为块级作用域。而JavaScript没有块级作用域。JavaScript使用了函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。

function test(o){
    var i=0;                                      //i在整个函数体内均是有定义的
    if(typeof o=="object"){
        var j=0;                                  //j 在函数体内是有定义的,不仅仅是在这个代码段内
        for(var k=0;k<10;k++){                    //k在函数体内是有定义的,不仅仅是在循环内
            console.log(k);                       //输出数字0-9
        }
        console.log(k);                           //k已经定义了,输出10
    }
    console.log(j);                               //j已经定义了,但可能没有初始化
}

JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。有意思的是,这意味着变量在声明之前甚至已经可用了。这种特性被非正式的称为声明提前。也就是JavaScript函数里声明的所有变量都被“提前”至函数体的顶部。比如如下的代码:

var scope = "global";
function f(){
    console.log(scope);
    var scope = "local";
    console.log(scope);
}

我们可能会误以为函数第一行会输出global,因为代码还没有执行到var语句声明局部变量的地方。其实不然,由于函数作用域的特殊性,局部变量在整个函数体始终是有定义的,也就是说,在函数体内局部变量遮盖了同名全局变量。所以上述过程等价于将函数体内的变量声明,提前告函数体顶部,同时变量初始化留在原来的位置。由于JavaScript没有块级作用域,因此将变量声明放在函数体顶部是一个好的编程习惯。

你可能感兴趣的:(Javascript)