表達(dá)式和語(yǔ)句
表達(dá)式
表達(dá)式有值
eg.console.log('3')
這就是一個(gè)表達(dá)式娄柳,因?yàn)槠溥\(yùn)行了以后會(huì)出值3
語(yǔ)句
語(yǔ)句無(wú)值
eg.let a=b
柒瓣,運(yùn)行后無(wú)值
區(qū)別:
- 語(yǔ)句無(wú)值饵筑,表達(dá)式有
- 語(yǔ)句一般會(huì)聲明/賦值,從而改變環(huán)境
- 這些區(qū)別不絕對(duì)
坑:
- 大小寫(xiě)敏感,不要寫(xiě)錯(cuò)
- var a 和 var A 是不同的
- object 和 Object 是不同的
- function 和 Function 是不同的
- 關(guān)于空格和回車(chē)
- 只要不影響斷句果复,大部分空格沒(méi)有實(shí)際意義
var a = 1 和 var a=1 沒(méi)有區(qū)別 - 加回車(chē)大部分時(shí)候也不影響
- g择伞<搿!澈驼!只有一個(gè)地方不能加回車(chē)辛燥,那就是 return 后面,加了回車(chē)會(huì)自動(dòng)隱性地補(bǔ)上 undefined缝其,回車(chē)后面的值不會(huì)上來(lái)挎塌。這是面試喜歡考的一個(gè)點(diǎn),面試不考常態(tài)只考變態(tài)内边。
- 語(yǔ)句和表達(dá)式變態(tài)情況:
-
console.log(3)
表達(dá)值是undefined榴都,因?yàn)闆](méi)有名字為3這種可以調(diào)用的函數(shù),如果要打印3漠其,則需要console.log('3')
加上‘’才可嘴高。 -
add(1,2)
表達(dá)值為函數(shù)的返回值 -
console.log
表達(dá)值為console.log本身
Tips:
一個(gè)函數(shù)的函數(shù)名即是該函數(shù)的代表,也是一個(gè)變量和屎。由于函數(shù)名變量通常用來(lái)把函數(shù)的處理結(jié)果數(shù)據(jù)返回給調(diào)用函數(shù)拴驮,即遞歸調(diào)用,所以一般把函數(shù)名變量稱(chēng)為返回值柴信,函數(shù)的返回值類(lèi)型是在定義函數(shù)時(shí)指定的莹汤。
也就是說(shuō),只有函數(shù)有返回值颠印,他的返回值就是他的值纲岭。函數(shù)可以有返回值,也可以沒(méi)有返回值线罕。
(1)沒(méi)有返回值的函數(shù):功能只是完成一個(gè)操作止潮,應(yīng)將返回值類(lèi)型定義為void,函數(shù)體內(nèi)可沒(méi)有return語(yǔ)句钞楼。
(2)有返回值的函數(shù):函數(shù)的最后會(huì)有一個(gè)返回值return喇闸,可以用來(lái)獲取該函數(shù)執(zhí)行結(jié)果返回給該函數(shù),讓外部調(diào)用該函數(shù)的。
標(biāo)識(shí)符
- 第一個(gè)字符燃乍,可以是 Unicode 字母或$或_或中文
Tips:Unicode 字母不只包含英文字母唆樊,還有希臘字母德語(yǔ)字母法語(yǔ)字母等,都可以用 - 后面的字符刻蟹,除了上面所說(shuō)逗旁,還可以有數(shù)字
- 變量名是標(biāo)識(shí)符
eg
var _=1
var $=2
var ______=6
var 你好='hi'
都是合理的。
Tips:
- 最好不要用多于2個(gè)_作為變量名舆瘪,因?yàn)楹茈y判斷有幾個(gè)
區(qū)塊 block
是用來(lái)把代碼包在一起片效,也就是{}
這個(gè)東西
{
let a=1
let b=2
}
block 一般不會(huì)單獨(dú)用,一般是跟if/for/while一起用
if 語(yǔ)句
- if(表達(dá)式){語(yǔ)句 1}else{語(yǔ)句 2}
- {}在語(yǔ)句只有一句的時(shí)候可以省略英古,不建議這樣做
坑
- 表達(dá)式里有坑淀衣,
eg. a=1 - 語(yǔ)句里有時(shí)候會(huì)嵌套的 if else
eg.
if(a<100)
else if(a>1000){console.log('a')}
else{console.log('b')}
這里出現(xiàn)了else if只是因?yàn)橛行r(shí)候可以省略{},完整的是
if(a<100){}
else{ if(a>1000){console.log('a')}
else{console.log('b')}}
其實(shí)這個(gè)是兩個(gè)if else語(yǔ)法召调,省略了一些{}出現(xiàn)的else if膨桥,并沒(méi)有這個(gè)else if的語(yǔ)法
- 縮進(jìn)也有坑,
eg
a=1
if(a===2)
console.log('a')
console.log('a等于2')
最后運(yùn)行會(huì)出現(xiàn)a等于2唠叛,因?yàn)檫@里是省略了{(lán)}只嚣,如果省略這個(gè)只能管到后面一句代碼
也就是
a=1
if(a===2){
console.log('a')}
console.log('a等于2')
如果是
a=1
if(a===2)
console.log('a') console.log('a等于2')
答案一樣,因?yàn)槭枪芤痪涠皇且欢尾J琷s中加回車(chē)大部分時(shí)候也不影響代碼運(yùn)行介牙。
但是若是
a=1
if(a===2)
console.log('a'),console.log('a等于2')
最后是undefined壮虫。因?yàn)槎禾?hào)表示這句話沒(méi)完澳厢,這兩個(gè)語(yǔ)句突然就變成了一個(gè)語(yǔ)句。分號(hào)的話囚似,就表示這句話完了剩拢。
最推薦使用的寫(xiě)法
if(表達(dá)式){
語(yǔ)句
}else if(表達(dá)式){
語(yǔ)句
}else{
語(yǔ)句
}
復(fù)制代碼
永遠(yuǎn)不要省略花括號(hào),就算里面只有一句也不要省略花括號(hào)饶唤。
次推薦使用的寫(xiě)法
function fn(){
if(表達(dá)式){
return 表達(dá)式
}
if(表達(dá)式){
return 表達(dá)式
}
return 表達(dá)式
}
switch 語(yǔ)句 徐伐,不推薦
eg
switch(fruit){
case 'banana':console.log('banana')
break;
case 'apple':console.log('apple')
break;}
意思是,在fruit這個(gè)東西里面募狂,如果出現(xiàn)是banana的情況办素,就console.log('banana');如果出現(xiàn)apple的情況祸穷,就console.log('apple')性穿。
- 大部分時(shí)候,省略 break 你就完了雷滚,如果要使用一定要記得使用break
- 少部分時(shí)候需曾,可以利用 break
問(wèn)號(hào)冒號(hào)表達(dá)式(三元表達(dá)式)
語(yǔ)法
表達(dá)式 1?表達(dá)式 2:表達(dá)式 3
Tips:
- 能用問(wèn)號(hào)冒號(hào)的時(shí)候,就不要用 if else
- 只可以用于if else里語(yǔ)句都只有一句的情況
eg
function max(a,b){
return a>b?a:b
}
其實(shí)是如下代碼
function max(a,b){
if(a>b)return a;
else return b;
}
&& 短路邏輯
A&&B&&C&&D
取第一個(gè)假值,若都為真呆万,則取D商源,并不會(huì)取 true/false
eg.
window.f1&&console.log('f1存在')
就是
if(window.f1){
console.log('f1存在')
}
||短路邏輯
A||B||C||D
取第一個(gè)真值,若全是假取 D谋减,并不會(huì)取 true/false
a||b
就是
if(!a){
b
}else{}
Tips:
- 牡彻!a代表如果a不是真的意思
a=a||100
就是
if(a){
a=a
}else{
a=100//保底值
}
前端程序員如果能寫(xiě)成||,就絕對(duì)不寫(xiě) if else
總結(jié)
條件語(yǔ)句
- if...else...
- switch
- A?B:C
- fn&&fn()
- A||B
- A=A||B
while 循環(huán)逃顶,當(dāng)...時(shí)
語(yǔ)法
eg
while(true){}
- while(表達(dá)式){語(yǔ)句}
- 判斷表達(dá)式的真假
- 當(dāng)表達(dá)式為真讨便,執(zhí)行語(yǔ)句,執(zhí)行完再判斷表達(dá)式的真假
- 當(dāng)表達(dá)式為假以政,執(zhí)行后面的語(yǔ)句
坑(考點(diǎn))
var a=0.1//初始化
while(a!==1){//判斷
console.log(a)//循環(huán)體
a=a+0.1//增長(zhǎng)
}
會(huì)出現(xiàn)死循環(huán)霸褒,這是因?yàn)樯厦娴母↑c(diǎn)數(shù)不精確造成的問(wèn)題,所以+0.1可能加著加著就會(huì)變成0.999而不是1盈蛮,所以永遠(yuǎn)到不了1
其他
- do...while废菱,用的不多
for 循環(huán)
- for 是 while 循環(huán)的方便寫(xiě)法,for 循環(huán)是 while 循環(huán)的升級(jí)寫(xiě)法
- while 循環(huán)有一個(gè)問(wèn)題是抖誉,你如果缺了一部分就會(huì)死循環(huán)殊轴,比如說(shuō)沒(méi)有寫(xiě)初始化,死循環(huán)袒炉,沒(méi)有寫(xiě)判斷或者判斷寫(xiě)錯(cuò)了旁理,死循環(huán),你沒(méi)有寫(xiě)循環(huán)體我磁,那你循環(huán)也沒(méi)什么用孽文,沒(méi)有寫(xiě)增長(zhǎng),死循環(huán)
語(yǔ)法
for(語(yǔ)句 1;表達(dá)式 2;語(yǔ)句 3){ 循環(huán)體 }
- 先執(zhí)行語(yǔ)句 1(語(yǔ)句 1 是用來(lái)初始化的)
- 然后判斷表達(dá)式 2(表達(dá)式 2 是用來(lái)判斷的)
- 如果為真夺艰,執(zhí)行循環(huán)體芋哭,然后執(zhí)行語(yǔ)句 3(語(yǔ)句 3 是自增用的)
- 如果為假,直接退出循環(huán)郁副,執(zhí)行后面的語(yǔ)句
- 注意:如果表達(dá)式 2 成立减牺,先執(zhí)行循環(huán)體,
再
執(zhí)行語(yǔ)句 3存谎,注意這個(gè)再
拔疚,這是考點(diǎn)。執(zhí)行循環(huán)體后既荚,一定會(huì)去執(zhí)行語(yǔ)句 3稚失,除非你有 break。
坑
for(var i=0;i<5;i++){
console.log(i)
}
問(wèn):i的值和打印的情況
答:i=5固以,且打印結(jié)果為0墩虹,1嘱巾,2,3诫钓,4旬昭,因順序問(wèn)題,如果表達(dá)式 2 成立菌湃,先執(zhí)行循環(huán)體问拘,再
執(zhí)行語(yǔ)句 3,這個(gè)時(shí)候如果表達(dá)式2不成立就不打印惧所,但是已經(jīng)循環(huán)到i=5的情況了骤坐。
for(var i=0;i<5;i++){
setTimeout(()=>{
console.log(i)
},0)
}
問(wèn):最后打印出來(lái)的結(jié)果。
答:五個(gè)5下愈,因?yàn)?setTimeout 過(guò)一會(huì)時(shí)間才打印纽绍,等過(guò)一會(huì),for已經(jīng)執(zhí)行完了势似,這個(gè)時(shí)候i=5拌夏,所以,打印出五個(gè) 5履因。不在于 for 循環(huán)障簿,在于 setTimeout 的時(shí)間問(wèn)題,這里i++的意思就是每次加1.
var a=1
function fn(){
console.log(a)
}
問(wèn):打印出 a栅迄,a 的值是多少站故?
答:不確定。因?yàn)?a 現(xiàn)在等于 1毅舆,但不知道什么時(shí)候執(zhí)行 fn西篓。a 的值可能會(huì)變,如果不確定函數(shù)是什么時(shí)候執(zhí)行的朗兵,永遠(yuǎn)不能確定 a 的值是多少污淋。所以如果我不能確定 fn()的調(diào)用時(shí)間顶滩,我是不能說(shuō) a 的值的余掖。
# break 和 continue
## 退出所有循環(huán) V.S.退出當(dāng)前一次循環(huán)
注意:break 只會(huì)退出離它最近的循環(huán),不會(huì)全退
# label 語(yǔ)句
## 用的很少礁鲁,面試會(huì)考(概率 5%)
### 語(yǔ)法
foo:{
console.log(1);
break foo;
console.log('本行不會(huì)輸出');
}
console.log(2);
### 面試
{
foo:1
}
* 問(wèn):上面的東西是什么
* 答:foo 是一個(gè) label盐欺,它的語(yǔ)句就是一個(gè) 1
## 推薦書(shū)籍
### 阮一峰的免費(fèi)教程
* [入門(mén)篇](https://link.juejin.im?target=http%3A%2F%2Fwangdoc.com%2Fjavascript%2Fbasic%2Fgrammar.html)
### 《你不知道的 JavaScript》
* 先買(mǎi)上卷,適合進(jìn)階