一铐维、JS的“語句”和“表達(dá)式”
JavaScript 程序的執(zhí)行單位為行(line)懈词,也就是一行一行地執(zhí)行。一般情況下结闸,每一行就是一個(gè)語句唇兑。
語句(statement)是為了完成某種任務(wù)而進(jìn)行的操作,比如下面就是一行賦值語句桦锄。
vara =1+3;
這條語句先用var命令扎附,聲明了變量a,然后將1 + 3的運(yùn)算結(jié)果賦值給變量a结耀。
1 + 3叫做表達(dá)式(expression)留夜,指一個(gè)為了得到返回值的計(jì)算式。語句和表達(dá)式的區(qū)別在于饼记,前者主要為了進(jìn)行某種操作香伴,一般情況下不需要返回值;后者則是為了得到返回值具则,一定會(huì)返回一個(gè)值即纲。凡是 JavaScript 語言中預(yù)期為值的地方,都可以使用表達(dá)式博肋。比如低斋,賦值語句的等號(hào)右邊,預(yù)期是一個(gè)值匪凡,因此可以放置各種表達(dá)式膊畴。
語句以分號(hào)結(jié)尾,一個(gè)分號(hào)就表示一個(gè)語句結(jié)束病游。多個(gè)語句可以寫在一行內(nèi)唇跨。
vara =1+3;varb ='abc';
分號(hào)前面可以沒有任何內(nèi)容稠通,JavaScript 引擎將其視為空語句。
;;;
上面的代碼就表示3個(gè)空語句买猖。
表達(dá)式不需要分號(hào)結(jié)尾改橘。一旦在表達(dá)式后面添加分號(hào),則 JavaScript 引擎就將表達(dá)式視為語句玉控,這樣會(huì)產(chǎn)生一些沒有任何意義的語句飞主。
二、關(guān)于標(biāo)識(shí)符
標(biāo)識(shí)符(identifier)指的是用來識(shí)別各種值的合法名稱高诺。最常見的標(biāo)識(shí)符就是變量名碌识,以及后面要提到的函數(shù)名。JavaScript 語言的標(biāo)識(shí)符對(duì)大小寫敏感虱而,所以a和A是兩個(gè)不同的標(biāo)識(shí)符筏餐。
標(biāo)識(shí)符有一套命名規(guī)則,不符合規(guī)則的就是非法標(biāo)識(shí)符薛窥。JavaScript 引擎遇到非法標(biāo)識(shí)符胖烛,就會(huì)報(bào)錯(cuò)。
簡單說诅迷,標(biāo)識(shí)符命名規(guī)則如下佩番。
第一個(gè)字符,可以是任意 Unicode 字母(包括英文字母和其他語言的字母)罢杉,以及美元符號(hào)($)和下劃線(_)趟畏。
第二個(gè)字符及后面的字符,除了 Unicode 字母滩租、美元符號(hào)和下劃線赋秀,還可以用數(shù)字0-9。
下面這些都是合法的標(biāo)識(shí)符律想。
arg0
_tmp
$elem
π
下面這些則是不合法的標(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)識(shí)符,可以用作變量名技即。
var臨時(shí)變量 =1;
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慎颗。
三乡恕、if 語句
if結(jié)構(gòu)先判斷一個(gè)表達(dá)式的布爾值言询,然后根據(jù)布爾值的真?zhèn)危瑘?zhí)行不同的語句傲宜。所謂布爾值运杭,指的是 JavaScript 的兩個(gè)特殊值,true表示真函卒,false表示偽辆憔。
if(布爾值)??
語句;
// 或者? if(布爾值) 語句;
上面是if結(jié)構(gòu)的基本形式。需要注意的是报嵌,“布爾值”往往由一個(gè)條件表達(dá)式產(chǎn)生的虱咧,必須放在圓括號(hào)中,表示對(duì)表達(dá)式求值锚国。如果表達(dá)式的求值結(jié)果為true腕巡,就執(zhí)行緊跟在后面的語句;如果結(jié)果為false血筑,則跳過緊跟在后面的語句绘沉。
if(m ===3)??
m = m +1;
上面代碼表示,只有在m等于3時(shí)豺总,才會(huì)將其值加上1车伞。
這種寫法要求條件表達(dá)式后面只能有一個(gè)語句。如果想執(zhí)行多個(gè)語句喻喳,必須在if的條件判斷之后帖世,加上大括號(hào),表示代碼塊(多個(gè)語句合并成一個(gè)語句)沸枯。
if(m ===3)?{?
?m +=1;
}
建議總是在if語句中使用大括號(hào)日矫,因?yàn)檫@樣方便插入語句。
注意绑榴,if后面的表達(dá)式之中哪轿,不要混淆賦值表達(dá)式(=)、嚴(yán)格相等運(yùn)算符(===)和相等運(yùn)算符(==)翔怎。尤其是賦值表達(dá)式不具有比較作用窃诉。
varx =1;
vary =2;
if(x = y) {
????console.log(x);
}
// "2"
上面代碼的原意是,當(dāng)x等于y的時(shí)候赤套,才執(zhí)行相關(guān)語句飘痛。但是,不小心將嚴(yán)格相等運(yùn)算符寫成賦值表達(dá)式容握,結(jié)果變成了將y賦值給變量x宣脉,再判斷變量x的值(等于2)的布爾值(結(jié)果為true)。
這種錯(cuò)誤可以正常生成一個(gè)布爾值剔氏,因而不會(huì)報(bào)錯(cuò)塑猖。為了避免這種情況竹祷,有些開發(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ò)
至于為什么優(yōu)先采用“嚴(yán)格相等運(yùn)算符”(===)令花,而不是“相等運(yùn)算符”(==),請(qǐng)參考《運(yùn)算符》章節(jié)凉倚。
四彭则、if...else 語句
if代碼塊后面,還可以跟一個(gè)else代碼塊占遥,表示不滿足條件時(shí),所要執(zhí)行的代碼输瓜。
if(m ===3) {
// 滿足條件時(shí)瓦胎,執(zhí)行的語句
}else{// 不滿足條件時(shí),執(zhí)行的語句
}
上面代碼判斷變量m是否等于3尤揣,如果等于就執(zhí)行if代碼塊搔啊,否則執(zhí)行else代碼塊。
對(duì)同一個(gè)變量進(jìn)行多次判斷時(shí)北戏,多個(gè)if...else語句可以連寫在一起负芋。
if(m ===0) {// ...
}else if(m ===1) {// ...
}else if(m ===2) {// ...
}else{// ...
}
else代碼塊總是與離自己最近的那個(gè)if語句配對(duì)。
五嗜愈、while 循環(huán)語句
While語句包括一個(gè)循環(huán)條件和一段代碼塊旧蛾,只要條件為真,就不斷循環(huán)執(zhí)行代碼塊蠕嫁。
while(條件)??
語句;
// 或者while(條件) 語句;
while語句的循環(huán)條件是一個(gè)表達(dá)式锨天,必須放在圓括號(hào)中。代碼塊部分剃毒,如果只有一條語句病袄,可以省略大括號(hào),否則就必須加上大括號(hào)赘阀。
while(條件) { 語句;
}
下面是while語句的一個(gè)例子益缠。
var i =0;
while(i <100) {
console.log('i 當(dāng)前為:'+ i);? i = i +1;
}
上面的代碼將循環(huán)100次,直到i等于100為止基公。
下面的例子是一個(gè)無限循環(huán)幅慌,因?yàn)檠h(huán)條件總是為真。
while(true) {
console.log('Hello, world');
}
六轰豆、for 循環(huán)
for語句是循環(huán)命令的另一種形式欠痴,可以指定循環(huán)的起點(diǎn)迄靠、終點(diǎn)和終止條件。它的格式如下喇辽。
for(初始化表達(dá)式; 條件; 遞增表達(dá)式)??
語句
// 或者?for (初始化表達(dá)式; 條件; 遞增表達(dá)式) {??
語句
}
for語句后面的括號(hào)里面掌挚,有三個(gè)表達(dá)式。
初始化表達(dá)式(initialize):確定循環(huán)變量的初始值菩咨,只在循環(huán)開始時(shí)執(zhí)行一次吠式。
條件表達(dá)式(test):每輪循環(huán)開始時(shí),都要執(zhí)行這個(gè)條件表達(dá)式抽米,只有值為真特占,才繼續(xù)進(jìn)行循環(huán)。
遞增表達(dá)式(increment):每輪循環(huán)的最后一個(gè)操作云茸,通常用來遞增循環(huán)變量是目。
下面是一個(gè)例子。
var x =3;
for(var i =0; i < x; i++) {
console.log(i);
}// 0// 1// 2
上面代碼中标捺,初始化表達(dá)式是var i = 0懊纳,即初始化一個(gè)變量i;測(cè)試表達(dá)式是i < x亡容,即只要i小于x嗤疯,就會(huì)執(zhí)行循環(huán);遞增表達(dá)式是i++闺兢,即每次循環(huán)結(jié)束后茂缚,i增大1。
所有for循環(huán)屋谭,都可以改寫成while循環(huán)脚囊。上面的例子改為while循環(huán),代碼如下桐磁。
var x =3;
var i =0;
while(i < x) {
console.log(i);? i++;
}
for語句的三個(gè)部分(initialize凑术、test、increment)所意,可以省略任何一個(gè)淮逊,也可以全部省略。
for( ; ; ){console.log('Hello World');}
上面代碼省略了for語句表達(dá)式的三個(gè)部分扶踊,結(jié)果就導(dǎo)致了一個(gè)無限循環(huán)泄鹏。
七、break 語句和continue語句
break語句和continue語句都具有跳轉(zhuǎn)作用秧耗,可以讓代碼不按既有的順序執(zhí)行备籽。
break語句用于跳出代碼塊或循環(huán)。
var i =0;
while(i <100) {
console.log('i 當(dāng)前為:'+ i);??
i++;
if(i ===10) break;
}
上面代碼只會(huì)執(zhí)行10次循環(huán),一旦i等于10车猬,就會(huì)跳出循環(huán)霉猛。
for循環(huán)也可以使用break語句跳出循環(huán)。
for(var i =0; i <5; i++) {
console.log(i);
if(i ===3) break;
} // 0// 1// 2// 3
上面代碼執(zhí)行到i等于3珠闰,就會(huì)跳出循環(huán)惜浅。
continue語句用于立即終止本輪循環(huán),返回循環(huán)結(jié)構(gòu)的頭部伏嗜,開始下一輪循環(huán)坛悉。
var i =0;
while(i <100){??
i++;
if(i %2===0) continue;
console.log('i 當(dāng)前為:'+ i);
}
上面代碼只有在i為奇數(shù)時(shí),才會(huì)輸出i的值承绸。如果i為偶數(shù)裸影,則直接進(jìn)入下一輪循環(huán)。
如果存在多重循環(huán)军熏,不帶參數(shù)的break語句和continue語句都只針對(duì)最內(nèi)層循環(huán)轩猩。
八、label(標(biāo)簽)
JavaScript 語言允許荡澎,語句的前面有標(biāo)簽(label)均践,相當(dāng)于定位符,用于跳轉(zhuǎn)到程序的任意位置衔瓮,標(biāo)簽的格式如下。
label:
? 語句
標(biāo)簽可以是任意的標(biāo)識(shí)符抖甘,但不能是保留字热鞍,語句部分可以是任意語句。
標(biāo)簽通常與break語句和continue語句配合使用衔彻,跳出特定的循環(huán)薇宠。
top:
for(var i =0; i <3; i++){
? ??for(var j =0; j <3; j++){
? ??????if(i ===1&& j ===1) break top;
? ??????console.log('i='+ i +', j='+ j);? ?
??? ???}?
?}? ?
?// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
上面代碼為一個(gè)雙重循環(huán)區(qū)塊,break命令后面加上了top標(biāo)簽(注意艰额,top不用加引號(hào))澄港,滿足條件時(shí),直接跳出雙層循環(huán)柄沮。如果break語句后面不使用標(biāo)簽回梧,則只能跳出內(nèi)層循環(huán),進(jìn)入下一次的外層循環(huán)祖搓。
標(biāo)簽也可以用于跳出代碼塊狱意。
foo:?
????{? console.log(1);?
? ? ? ? break foo;
? ? ? ? console.log('本行不會(huì)輸出');
? ? ?}?
? ? ? ? console.log(2);
// 1
// 2
上面代碼執(zhí)行到break foo,就會(huì)跳出區(qū)塊拯欧。
continue語句也可以與標(biāo)簽配合使用详囤。
top:
for(var i =0; i <3; i++){
????for(var j =0; j <3; j++){
????????if(i ===1&& j ===1)? continue? top;
????????????console.log('i='+ i +', j='+ j);? ?
? ? ? }?
?}
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
// i=2, j=0
// i=2, j=1
// i=2, j=2
上面代碼中,continue命令后面有一個(gè)標(biāo)簽名镐作,滿足條件時(shí)藏姐,會(huì)跳過當(dāng)前循環(huán)隆箩,直接進(jìn)入下一輪外層循環(huán)。如果continue語句后面不使用標(biāo)簽羔杨,則只能進(jìn)入下一輪的內(nèi)層循環(huán)捌臊。