Monthly Archives: April 2012

JS Traps (1)

1. 变量的作用域

JS里不存在block scope(一对花括号里的区域), 只有global scope和function scope。只要在函数内部用var形式定义了变量,它的作用域就是整个函数。即使在进入函数但是还没有遇到var之前也是这样,此时这个局部变量的值是undefined。所以下面的代码输出就可以理解了:

var scope = "global";
function f() {
    console.log(scope);  // output "undefined"
    if (true) {
         var scope = "local";
         console.log(scope);  // output "local"
    }
    console.log(scope);  // output "local"
}

在C或Java等语言里,在用到变量的最小block里再定义此变量是一个好习惯,但是在JS里为了避免混乱,最好在函数一开始就把所有的局部变量都定义出来。另外,千万不要省略var语句,否则会变成全局变量了。

2. 基本数据类型(number, bool, string)是不可变的,对象类型是可变的,对对象类型赋值时传递的是引用,而不是拷贝这个对象。这个和Java一致,C++同学要注意。

用===判断相等时,如果是基本数据类型,是进行值比较。如果是对象类型,比较的是地址,必须真的是同一个对象时才认为相等:

var a = [], b = [];
a === b  // false
a = b;
a === b  // true

3. 尽量用===/!==,尽量避免用==/!=。后者在比较的类型不同时容易坑爹。

下面例子引自“JavaScript: The Good Parts”

'' == '0'          // false
0 == ''            // true
0 == '0'           // true
false == 'false'   // false
false == '0'       // true
false == undefined // false
false == null      // false
null == undefined  // true
' \t\r\n ' == 0    // true