JS 的基本語法

一铐维、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)捌臊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市问畅,隨后出現(xiàn)的幾起案子娃属,更是在濱河造成了極大的恐慌,老刑警劉巖护姆,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矾端,死亡現(xiàn)場離奇詭異,居然都是意外死亡卵皂,警方通過查閱死者的電腦和手機(jī)秩铆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灯变,“玉大人殴玛,你說我怎么就攤上這事√砘觯” “怎么了滚粟?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長刃泌。 經(jīng)常有香客問我凡壤,道長,這世上最難降的妖魔是什么耙替? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任亚侠,我火速辦了婚禮,結(jié)果婚禮上俗扇,老公的妹妹穿的比我還像新娘硝烂。我一直安慰自己,他們只是感情好铜幽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布滞谢。 她就那樣靜靜地躺著,像睡著了一般除抛。 火紅的嫁衣襯著肌膚如雪爹凹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天镶殷,我揣著相機(jī)與錄音禾酱,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颤陶,可吹牛的內(nèi)容都是我干的颗管。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滓走,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼垦江!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搅方,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤比吭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后姨涡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衩藤,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年涛漂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赏表。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片参滴。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纺蛆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帘睦,到底是詐尸還是另有隱情悠轩,我是刑警寧澤间狂,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站火架,受9級(jí)特大地震影響鉴象,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜距潘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一炼列、第九天 我趴在偏房一處隱蔽的房頂上張望只搁。 院中可真熱鬧,春花似錦氢惋、人聲如沸洞翩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熊赖。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間俱笛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國打工迎膜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磕仅。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像榕订,于是被迫代替她去往敵國和親店茶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卸亮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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

  • 一忽妒、JavaScript和ECMAScript的關(guān)系 1996年8月,微軟模仿JavaScript開發(fā)了一種相近的...
    瘋狂的蝸牛Dianna閱讀 456評(píng)論 0 0
  • 在C語言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,345評(píng)論 0 2
  • 前端07班 王語句JavaScript程序的執(zhí)行單位為行(line)兼贸,也就是一行一行地執(zhí)行段直。一般情況下,每一行就是...
    ea203453e188閱讀 887評(píng)論 0 4
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,803評(píng)論 0 38
  • 語句 JavaScript程序的執(zhí)行單位為行(line)溶诞,也就是一行一行地執(zhí)行鸯檬。一般情況下,每一行就是一個(gè)語句螺垢。 ...
    米塔塔閱讀 458評(píng)論 1 10