JS基本語法

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.大小寫俊庇、空格和換行

  1. 首先狮暑,JavaScript是大小寫敏感的
    var avar A是不一樣的辉饱;
    objectObject是不一樣的搬男;
    functionFunction是不一樣的。

  2. 大多數(shù)空格沒有實際意義
    var a=1var a = 1是一樣的彭沼。

  3. 加回車大部分時候也沒有影響缔逛,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绍绘、 forwhile迟赃、function一起使用陪拘。

6.條件語句

6.1 if else

語法:if(表達(dá)式){語句1}else{語句2}
執(zhí)行順序:表達(dá)式為真執(zhí)行語句1纤壁,表達(dá)式為假則跳過語句1直接執(zhí)行語句2左刽。
{}在只有一行語句的時候可以省略,但不建議省略摄乒。原因是為了后面方便插入新的語句悠反。

  1. if后面的表達(dá)式之中残黑,a=1是賦值表達(dá)式,不具有比較作用斋否。這里要寫成嚴(yán)格相等運算符(===)梨水。如a===1
    此處待補充:為什么優(yōu)先采用“嚴(yán)格相等運算符”(===)茵臭,而不是“相等運算符”(==)疫诽。
  2. 如果省略{},見下面代碼:
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

breakcontinue語句都具有跳轉(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)渐裂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末豺旬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柒凉,更是在濱河造成了極大的恐慌族阅,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膝捞,死亡現(xiàn)場離奇詭異坦刀,居然都是意外死亡,警方通過查閱死者的電腦和手機蔬咬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門鲤遥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人林艘,你說我怎么就攤上這事盖奈。” “怎么了狐援?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵钢坦,是天一觀的道長。 經(jīng)常有香客問我咕村,道長场钉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任懈涛,我火速辦了婚禮逛万,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己宇植,他們只是感情好得封,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著指郁,像睡著了一般忙上。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闲坎,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天疫粥,我揣著相機與錄音,去河邊找鬼腰懂。 笑死梗逮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绣溜。 我是一名探鬼主播慷彤,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怖喻!你這毒婦竟也來了底哗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锚沸,失蹤者是張志新(化名)和其女友劉穎跋选,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哗蜈,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡野建,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恬叹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡同眯,死狀恐怖绽昼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情须蜗,我是刑警寧澤硅确,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站明肮,受9級特大地震影響菱农,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柿估,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一循未、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秫舌,春花似錦的妖、人聲如沸绣檬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娇未。三九已至,卻和暖如春星虹,著一層夾襖步出監(jiān)牢的瞬間零抬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工宽涌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留平夜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓护糖,卻偏偏與公主長得像褥芒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嫡良,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一锰扶、JS的“語句”和“表達(dá)式” JavaScript 程序的執(zhí)行單位為行(line),也就是一行一行地執(zhí)行寝受。一般情...
    scotton閱讀 274評論 0 0
  • 什么是表達(dá)式和語句JavaScript 程序的執(zhí)行單位為行(line)坷牛,也就是一行一行地執(zhí)行。一般情況下很澄,每一行就...
    wc520閱讀 147評論 0 1
  • 一京闰、JavaScript和ECMAScript的關(guān)系 1996年8月,微軟模仿JavaScript開發(fā)了一種相近的...
    瘋狂的蝸牛Dianna閱讀 456評論 0 0
  • 1.什么是表達(dá)式和語句 表達(dá)式:是由運算元和運算符(可選)構(gòu)成甩苛,并產(chǎn)生運算結(jié)果的語法結(jié)構(gòu)蹂楣。比如: 語句:JavaS...
    我愚蠢的理想主義啊閱讀 285評論 0 0
  • 語句和表達(dá)式 語句(statement)是為了完成某種任務(wù)而進(jìn)行的操作,JavaScript 程序的執(zhí)行單位為行(...
    pang猴子閱讀 322評論 0 0