如果使用var重新聲明一個(gè)已經(jīng)存在的變量,是無(wú)效的叙身。
var x=1;
var x;
上面代碼中,變量x聲明了兩次硫狞,第二次聲明是無(wú)效的信轿。
但是晃痴,如果第二次聲明的同時(shí)還賦值了,則會(huì)覆蓋掉前面的值财忽。
變量提升
JavaScript引擎的工作方式是倘核,先解析代碼,獲取所有被聲明的變量即彪,然后再一行一行地運(yùn)行紧唱。這造成的結(jié)果,就是所有的變量的聲明語(yǔ)句隶校,都會(huì)被提升到代碼的頭部漏益,這就叫做變量提升(hoisting)。
console.log(a);?
var a=1;
上面代碼首先使用console.log方法惠况,在控制臺(tái)(console)顯示變量a的值遭庶。這時(shí)變量a還沒有聲明和賦值,所以這是一種錯(cuò)誤的做法稠屠,但是實(shí)際上不會(huì)報(bào)錯(cuò)峦睡。因?yàn)榇嬖谧兞刻嵘嬲\(yùn)行的是下面的代碼权埠。
var a;
console.log(a);
a=1;
最后的結(jié)果是顯示undefined榨了,表示變量a已聲明,但還未賦值攘蔽。
請(qǐng)注意龙屉,變量提升只對(duì)var命令聲明的變量有效,如果一個(gè)變量不是用var命令聲明的满俗,就不會(huì)發(fā)生變量提升转捕。
console.log(b);
b=1;
上面的語(yǔ)句將會(huì)報(bào)錯(cuò),提示“ReferenceError: b is not defined”唆垃,即變量b未聲明五芝,這是因?yàn)閎不是用var命令聲明的,JavaScript引擎不會(huì)將其提升辕万,而只是視為對(duì)頂層對(duì)象的b屬性的賦值枢步。
標(biāo)識(shí)符
規(guī)則如下:
第一個(gè)字符,可以是任意Unicode字母(包括英文字母和其他語(yǔ)言的字母)渐尿,以及美元符號(hào)($)和下劃線(_)醉途。
第二個(gè)字符及后面的字符,除了Unicode字母砖茸、美元符號(hào)和下劃線隘擎,還可以用數(shù)字0-9。
下面這些則是不合法的標(biāo)識(shí)符凉夯。
1a? // 第一個(gè)字符不能是數(shù)字
23 ?// 同上
***? // 標(biāo)識(shí)符不能包含星號(hào)
a+b? // 標(biāo)識(shí)符不能包含加號(hào)
-d ?// 標(biāo)識(shí)符不能包含減號(hào)或連詞線
中文是合法的標(biāo)示符
JavaScript有一些保留字嵌屎,不能用作標(biāo)識(shí)符: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。
另外名眉,還有三個(gè)詞雖然不是保留字粟矿,但是因?yàn)榫哂刑貏e含義,也不應(yīng)該用作標(biāo)識(shí)符:Infinity损拢、NaN陌粹、undefined。
if結(jié)構(gòu)
var x=1;
var y=2;
if(x=y)
{
console.log(x);
}
// "2"
為避免以上情況福压,有些開發(fā)者習(xí)慣將常量寫在運(yùn)算符的左邊掏秩,這樣的話,一旦不小心將相等運(yùn)算符寫成賦值運(yùn)算符隧膏,就會(huì)報(bào)錯(cuò)哗讥,因?yàn)槌A坎荒鼙毁x值。
if(x=2){ ?// 不報(bào)錯(cuò)
if(2=x){ ?// 報(bào)錯(cuò)
switch結(jié)構(gòu)
需要注意的是胞枕,每個(gè)case代碼塊內(nèi)部的break語(yǔ)句不能少杆煞,否則會(huì)接下去執(zhí)行下一個(gè)case代碼塊,而不是跳出switch結(jié)構(gòu)腐泻。