如果使用var重新聲明一個已經存在的變量,是無效的。
var x=1;
var x;
上面代碼中,變量x聲明了兩次,第二次聲明是無效的。
但是,如果第二次聲明的同時還賦值了,則會覆蓋掉前面的值。
變量提升
JavaScript引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然后再一行一行地運行。這造成的結果,就是所有的變量的聲明語句,都會被提升到代碼的頭部,這就叫做變量提升(hoisting)。
console.log(a);?
var a=1;
上面代碼首先使用console.log方法,在控制臺(console)顯示變量a的值。這時變量a還沒有聲明和賦值,所以這是一種錯誤的做法,但是實際上不會報錯。因為存在變量提升,真正運行的是下面的代碼。
var a;
console.log(a);
a=1;
最后的結果是顯示undefined,表示變量a已聲明,但還未賦值。
請注意,變量提升只對var命令聲明的變量有效,如果一個變量不是用var命令聲明的,就不會發生變量提升。
console.log(b);
b=1;
上面的語句將會報錯,提示“ReferenceError: b is not defined”,即變量b未聲明,這是因為b不是用var命令聲明的,JavaScript引擎不會將其提升,而只是視為對頂層對象的b屬性的賦值。
標識符
規則如下:
第一個字符,可以是任意Unicode字母(包括英文字母和其他語言的字母),以及美元符號($)和下劃線(_)。
第二個字符及后面的字符,除了Unicode字母、美元符號和下劃線,還可以用數字0-9。
下面這些則是不合法的標識符。
1a? // 第一個字符不能是數字
23 ?// 同上
***? // 標識符不能包含星號
a+b? // 標識符不能包含加號
-d ?// 標識符不能包含減號或連詞線
中文是合法的標示符
JavaScript有一些保留字,不能用作標識符:arguments、break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、eval、export、extends、false、finally、for、function、if、implements、import、in、instanceof、interface、let、new、null、package、private、protected、public、return、static、super、switch、this、throw、true、try、typeof、var、void、while、with、yield。
另外,還有三個詞雖然不是保留字,但是因為具有特別含義,也不應該用作標識符:Infinity、NaN、undefined。
if結構
var x=1;
var y=2;
if(x=y)
{
console.log(x);
}
// "2"
為避免以上情況,有些開發者習慣將常量寫在運算符的左邊,這樣的話,一旦不小心將相等運算符寫成賦值運算符,就會報錯,因為常量不能被賦值。
if(x=2){ ?// 不報錯
if(2=x){ ?// 報錯
switch結構
需要注意的是,每個case代碼塊內部的break語句不能少,否則會接下去執行下一個case代碼塊,而不是跳出switch結構。