1.表達(dá)式與語句
JavaScript 程序的執(zhí)行單位為行(line)皂林,也就是一行一行地執(zhí)行。一般情況下,每一行就是一個語句倍试。
比如下面就是一行賦值語句。
var a = 1 + 3;
其中1+3
是表達(dá)式(expression)
蛋哭,表達(dá)式是一個計算式县习,為了得到一個返回值。
1+3 //表達(dá)式的值為4
add(1,2) //表達(dá)式的值為函數(shù)的返回值
console.log() //表達(dá)式的值為console.log()
console.log(3) //表達(dá)式的值為 undefined
表達(dá)式和語句的區(qū)別
①
表達(dá)式
是一個計算式谆趾,一定會有一個返回值躁愿。
語句
是一步要執(zhí)行的操作,一般改變環(huán)境(聲明沪蓬、變量)彤钟。一般情況不會返回值。
②
表達(dá)式
不需要分號結(jié)尾跷叉。一旦在表達(dá)式后面添加分號逸雹,則 JavaScript 引擎就將表達(dá)式視為語句,這樣會產(chǎn)生一些沒有任何意義的語句云挟。
1 + 3 ; //只是單純地產(chǎn)生一個值梆砸,沒有實際的意義。
語句
以分號結(jié)尾植锉,一個分號就表示一個語句結(jié)束辫樱。多個語句可以寫在一行內(nèi)。
2.大小寫俊庇、空格和換行
首先狮暑,JavaScript是大小寫敏感的。
var a
和var A
是不一樣的辉饱;
object
和Object
是不一樣的搬男;
function
和Function
是不一樣的。大多數(shù)空格沒有實際意義
var a=1
和var a = 1
是一樣的彭沼。加回車大部分時候也沒有影響缔逛,但
return
后面不能加回車。
return
3 //這里return 3 不寫到一行的話姓惑,會返回undefined
3.標(biāo)識符
標(biāo)識符(identifier)指的是用來識別各種值的合法名稱褐奴。最常見的標(biāo)識符就是變量名,以及后面要提到的函數(shù)名于毙。
標(biāo)識符有一套命名規(guī)則敦冬,不符合規(guī)則的就是非法標(biāo)識符。JavaScript 引擎遇到非法標(biāo)識符唯沮,就會報錯如下脖旱。
Uncaught SyntaxError: Invalid or unexpected token
未捕獲的語法錯誤:無效或意外的字符串
標(biāo)識符命名規(guī)則:
- 第一個字符堪遂,可以是任意 Unicode 字母(包括英文字母和其他語言的字母),以及美元符號(
$
)和下劃線(_
)萌庆。 - 第二個字符及后面的字符溶褪,除了 Unicode 字母、美元符號和下劃線践险,還可以用數(shù)字
0-9
猿妈。
下面這些都是合法的標(biāo)識符。
a1
$8
_last
π
下面這些則是不合法的標(biāo)識符捏境。
1a // 第一個字符不能是數(shù)字
23 // 同上
*** // 標(biāo)識符不能包含星號
a+b // 標(biāo)識符不能包含加號
-d // 標(biāo)識符不能包含減號或連詞線
中文也是合法的標(biāo)識符于游,可以用作變量名。
var 臨時變量 = 1;
4.注釋
源碼中被 JavaScript 引擎忽略的部分就叫做注釋垫言,它的作用是對代碼進(jìn)行解釋。
JavaScript 提供兩種注釋的寫法:
- 一種是單行注釋倾剿,用
//
起頭筷频; - 另一種是多行注釋,放在
/*
和*/
之間前痘。
// 這是單行注釋
/*
這是
多行
注釋
*/
<!-- 這也是單行注釋凛捏。由于歷史上 JavaScript 可以兼容 HTML 代碼的注釋-->
優(yōu)秀的注釋應(yīng)該寫最關(guān)鍵的內(nèi)容,比如:
- 踩坑注解芹缔;
- 此處遇到bug后坯癣,加了XXX代碼;
- 解釋某處奇怪的代碼是因為某些特殊需求最欠。
5.區(qū)塊block
JavaScript 使用大括號示罗,將多個相關(guān)的語句組合在一起,稱為“區(qū)塊”(block)芝硬。
在 JavaScript 語言中蚜点,單獨使用區(qū)塊并不常見,區(qū)塊往往用來構(gòu)成其他更復(fù)雜的語法結(jié)構(gòu)拌阴,常與if
绍绘、 for
、while
迟赃、function
一起使用陪拘。
6.條件語句
6.1 if else
語法:if(表達(dá)式){語句1}else{語句2}
。
執(zhí)行順序:表達(dá)式為真執(zhí)行語句1纤壁,表達(dá)式為假則跳過語句1直接執(zhí)行語句2左刽。
{}
在只有一行語句的時候可以省略,但不建議省略摄乒。原因是為了后面方便插入新的語句悠反。
坑
- 在
if
后面的表達(dá)式之中残黑,a=1
是賦值表達(dá)式,不具有比較作用斋否。這里要寫成嚴(yán)格相等運算符(===
)梨水。如a===1
。
此處待補充:為什么優(yōu)先采用“嚴(yán)格相等運算符”(===
)茵臭,而不是“相等運算符”(==
)疫诽。 - 如果省略
{}
,見下面代碼:
a = 1
if(a===2)
console.log('a')
console.log('a等于2')
正確輸出是:a等于2
旦委。因為它的完整格式如下:
a = 1
if(a===2){
console.log('a')
}else{
console.log('a等于2')
}
為避免歧義奇徒,最推薦下面結(jié)構(gòu)寫代碼
if (表達(dá)式){
語句1
}else if (表達(dá)式){
語句2
}else {
語句3
}
6.2 switch case
多個if...else
連在一起使用的時候,可以轉(zhuǎn)為使用更方便的 switch
結(jié)構(gòu)缨硝。
語法:
switch (fruit) {
case "banana":
// ...
break;
case "apple":
// ...
break;
default:
// ...
}
上面代碼根據(jù)變量fruit
的值摩钙,選擇執(zhí)行相應(yīng)的case
。如果所有case
都不符合查辩,則執(zhí)行最后的default
部分胖笛。需要注意的是,每個case
代碼塊內(nèi)部的break
語句不能少宜岛,否則會接下去執(zhí)行下一個case代碼塊长踊,而不是跳出switch結(jié)構(gòu)。
6.3 三元運算符
問號冒號表達(dá)式
語法:表達(dá)式1?表達(dá)式2:表達(dá)式3
7. 短路邏輯
7.1 && 與
A&&B&&C&&D 取按順序出現(xiàn)的第一個假值 或 取D萍倡。并不會取true/false身弊。
常寫
fn && fn() //如果fn存在就調(diào)用fn()
7.2 || 或
A||B||C||D 取按順序出現(xiàn)的第一個真值 或 取D。并不會取true/false列敲。
常寫
A = A || B //A存在就什么也不做阱佛,A不存在就取B(B為保底值)
8.循環(huán)語句
循環(huán)語句用于重復(fù)執(zhí)行某個操作,它有多種形式酿炸。
8.1 while 循環(huán)
語法:while(表達(dá)式){語句}
瘫絮。
執(zhí)行順序:判斷表達(dá)式的真假,若表達(dá)式為真則執(zhí)行語句填硕,執(zhí)行完再判斷表達(dá)式的真假麦萤;
若表達(dá)式為假,則跳出循環(huán)代碼塊執(zhí)行循環(huán)后面的語句扁眯。
代碼示例:
var i = 0;
while (i < 10) {
console.log('i 當(dāng)前為:' + i);
i = i + 1;
}
不要寫死循環(huán)
死循環(huán)舉例1:
var a=0.1
while(!a==1){
console.log(a)
a=a+0.1
}
原因:浮點數(shù)是不精確的壮莹,每次相加后的取值是不精確,所以a一直取不到1姻檀。無法跳出循環(huán)命满。
8.2 for 循環(huán)
語法:for(語句1;表達(dá)式2;語句3){循環(huán)體}
執(zhí)行順序:
①先執(zhí)行語句1;
②判斷表達(dá)式2绣版;
③若真胶台,執(zhí)行循環(huán)體歼疮,然后執(zhí)行語句3;
④若假诈唬,直接退出循環(huán)韩脏,然后執(zhí)行后面的語句。
代碼示例:
var x = 3;
for (var i = 0; i < x; i++) {
console.log(i);
}
// 0
// 1
// 2
特殊舉例:
for(var i=0;i<5;i++){
setTimeout(() => {console.log(i)})
}
輸出結(jié)果:會輸出5個5
原因:在循環(huán)體i的最后一次值是4铸磅,但在跳出循環(huán)體后還執(zhí)行了一次i++,所有結(jié)果是5赡矢,又因循環(huán)5次,所有是5個5阅仔。
8.3 do while 循環(huán)
不常用吹散。
語法:
do
語句
while (條件);
// 或者
do {
語句
} while (條件);
不管條件是否為真,do...while
循環(huán)至少運行一次八酒,這是這種結(jié)構(gòu)最大的特點空民。另外,while
句后面的分號注意不要省略羞迷。
8.4 break 和 continue
break
和continue
語句都具有跳轉(zhuǎn)作用袭景,可以讓代碼不按既有的順序執(zhí)行。
break
是退出所有循環(huán)闭树,continue
是退出當(dāng)前循環(huán),直接下一步荒澡。
如果存在多重循環(huán)报辱,不帶參數(shù)的break語句和continue語句都只針對最內(nèi)層循環(huán)。
8.5 label標(biāo)簽
不常用单山。
JavaScript 語言允許碍现,語句的前面有標(biāo)簽(label),相當(dāng)于定位符米奸,用于跳轉(zhuǎn)到程序的任意位置昼接,標(biāo)簽的格式如下。
label:
語句
標(biāo)簽可以是任意的標(biāo)識符悴晰,但不能是保留字慢睡,語句部分可以是任意語句。
標(biāo)簽通常與break語句和continue語句配合使用铡溪,跳出特定的循環(huán)漂辐。
標(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
上面代碼為一個雙重循環(huán)區(qū)塊髓涯,break命令后面加上了top標(biāo)簽(注意,top不用加引號)哈扮,滿足條件時纬纪,直接跳出雙層循環(huán)蚓再。如果break語句后面不使用標(biāo)簽,則只能跳出內(nèi)層循環(huán)包各,進(jìn)入下一次的外層循環(huán)摘仅。
標(biāo)簽也可以用于跳出代碼塊。
foo: {
console.log(1);
break foo;
console.log('本行不會輸出');
}
console.log(2);
// 1
// 2
上面代碼執(zhí)行到break foo髓棋,就會跳出區(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命令后面有一個標(biāo)簽名膳犹,滿足條件時,會跳過當(dāng)前循環(huán)签则,直接進(jìn)入下一輪外層循環(huán)须床。如果continue語句后面不使用標(biāo)簽,則只能進(jìn)入下一輪的內(nèi)層循環(huán)渐裂。