基礎(chǔ)語(yǔ)法
一、基礎(chǔ)語(yǔ)法
1、變量
概念:內(nèi)存中存儲(chǔ)數(shù)據(jù)的一個(gè)容器。
聲明方式:
var 變量名 // 在內(nèi)存中開(kāi)辟了一個(gè)空間
var 變量名 = 值 // 內(nèi)存中開(kāi)辟空間并放入數(shù)據(jù)
變量名的規(guī)則:變量名由字母、數(shù)字、下劃線、美元符號(hào)、漢字組成,不能用數(shù)字開(kāi)頭,不能將關(guān)鍵字作為變量名。
關(guān)鍵字:
var typeof isNaN Number String Boolean Object Array Function function break if else switch case default for while do continue in of Date top window new this Math
=在代碼中不叫等于叫賦值符。左邊一定是一個(gè)即將放入數(shù)據(jù)的變量,右邊一定是具體的數(shù)據(jù)或能得到具體數(shù)據(jù)的表達(dá)式,作用是將右邊的數(shù)據(jù)放入左邊的變量中。
2、數(shù)據(jù)類型
js中的數(shù)據(jù)類型:
-
number:數(shù)字類型
isNaN(數(shù)據(jù)) - 判斷數(shù)據(jù)轉(zhuǎn)成數(shù)字是否是NaN
小數(shù)計(jì)算不精準(zhǔn):
原因:計(jì)算機(jī)內(nèi)部對(duì)數(shù)字的處理要轉(zhuǎn)成二進(jìn)制,小數(shù)轉(zhuǎn)二進(jìn)制有時(shí)會(huì)轉(zhuǎn)成無(wú)限死循環(huán),導(dǎo)致計(jì)算機(jī)存儲(chǔ)小數(shù)不精準(zhǔn),所以計(jì)算結(jié)果也不精準(zhǔn)。
解決:
① 先乘以10的n次方將兩個(gè)數(shù)字都轉(zhuǎn)成整數(shù),計(jì)算,除以10的n次方 ② 數(shù)字.toFixed(數(shù)字) - 強(qiáng)制保留小數(shù)點(diǎn)后幾位 -
string:字符串類型
字符串可以進(jìn)行
+運(yùn)算,將兩個(gè)小字符串拼接成更大的字符串用document.write輸出標(biāo)簽,必須將標(biāo)簽當(dāng)做字符串輸出,才能在頁(yè)面中解析標(biāo)簽
單引號(hào)字符串不能嵌套單引號(hào)字符,雙引號(hào)字符串不能嵌套雙引號(hào)字符,除非將引號(hào)字符轉(zhuǎn)義:
\ boolean:布爾值 - 描述一個(gè)條件的成立與不成立,只有兩個(gè)數(shù)據(jù):true/false
undefined:未定義 - 當(dāng)一個(gè)變量定義了但沒(méi)有賦值,值就是undefined(淺灰色),類型也是undefined(黑色字符串)
object:對(duì)象 - 復(fù)雜的數(shù)據(jù),一個(gè)空間存儲(chǔ)多個(gè)數(shù)據(jù)
function:函數(shù) - 存儲(chǔ)一段代碼的變量
3、運(yùn)算
-
算術(shù)運(yùn)算
符號(hào):
+ - * / %
-
賦值運(yùn)算
+= -= *= /= %=是簡(jiǎn)寫(xiě)
-
比較/關(guān)系運(yùn)算
> >= < <= == === != !==!=和!==是==和===的取反
-
邏輯運(yùn)算
&& || !
4、類型轉(zhuǎn)換
4.1、隱形轉(zhuǎn)換
-
+左右兩邊有一個(gè)是字符串,另一個(gè)也會(huì)轉(zhuǎn)成字符串進(jìn)行拼接 - 算術(shù)運(yùn)算符號(hào)會(huì)將左右兩邊都轉(zhuǎn)成數(shù)字進(jìn)行算數(shù)運(yùn)算
- 比較運(yùn)算左右兩邊有一個(gè)是數(shù)字,另一個(gè)也會(huì)轉(zhuǎn)成數(shù)字進(jìn)行數(shù)字的大小比較
- 數(shù)據(jù)放在分支語(yǔ)句的小括號(hào),會(huì)隱形轉(zhuǎn)成布爾類型
- 非字符串?dāng)?shù)據(jù)作為對(duì)象的屬性,會(huì)隱形轉(zhuǎn)成字符串類型
4.2、強(qiáng)制轉(zhuǎn)換
-
轉(zhuǎn)數(shù)字
Number(數(shù)據(jù)):
轉(zhuǎn)成數(shù)字純數(shù)字字符串
空字符串、null、[]轉(zhuǎn)成0,其余數(shù)據(jù)都轉(zhuǎn)成NaN
parseInt(數(shù)據(jù)):只有整數(shù)開(kāi)頭的字符串能轉(zhuǎn)成整數(shù),其余的都是NaN
parseFloat(數(shù)據(jù)):只有數(shù)字開(kāi)頭的字符串能轉(zhuǎn)成數(shù)字,其余的都是NaN
-
轉(zhuǎn)布爾類型
Boolean(數(shù)據(jù)):0、空字符串、null、undefined轉(zhuǎn)成false,其余的都是true
-
轉(zhuǎn)成字符串
String(數(shù)據(jù)):數(shù)組轉(zhuǎn)字符串,去除了[];對(duì)象轉(zhuǎn)字符串 - '[object Object]'
數(shù)據(jù).toString():null和undefined不能使用,其余的結(jié)果跟上面一樣
二、分支語(yǔ)句
概念:做判斷的結(jié)構(gòu)
1、單分支
if(條件) {
當(dāng)條件為true的時(shí)候執(zhí)行的代碼段
}
2、雙分支
if(條件) {
當(dāng)條件是true的時(shí)候執(zhí)行的代碼段
} else {
當(dāng)條件為false的時(shí)候執(zhí)行的代碼段
}
3、多分支
if(條件1) {
當(dāng)條件1是true的時(shí)候執(zhí)行的代碼段
} else if(條件2) {
當(dāng)條件2是true的時(shí)候執(zhí)行的代碼段
} else if(條件3){
當(dāng)條件3是true的時(shí)候執(zhí)行的代碼段
}...
else{
上面條件都是false的時(shí)候執(zhí)行的代碼段
}
多選1執(zhí)行
第一個(gè)不成立,才會(huì)去執(zhí)行第二個(gè)。。。
4、switch多路判斷
switch(變量) {
case 值1:
當(dāng)變量 === 值1 的時(shí)候執(zhí)行的代碼段
break
case 值2:
當(dāng)變量 === 值2 的時(shí)候執(zhí)行的代碼段
break
....
default:
上面條件都不成立的時(shí)候執(zhí)行的代碼段
}
break可以省略,后續(xù)的case不判斷,直接執(zhí)行
default可以省略
多路判斷比多分支效率高,只判斷一次
多路判斷只能判斷 全等
5、三元運(yùn)算
能且僅能簡(jiǎn)化簡(jiǎn)單的雙分支
條件 ? 條件是true的時(shí)候執(zhí)行的代碼 : 條件是false的時(shí)候執(zhí)行的代碼
整個(gè)三元運(yùn)算表達(dá)式可以當(dāng)做是一個(gè)具體的數(shù)據(jù),進(jìn)行輸出、賦值
例:
num = num.length === 1 ? '0'+num : num
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed)
三、循環(huán)結(jié)構(gòu)
學(xué)習(xí)目的:簡(jiǎn)化重復(fù)
1、while
while(條件) {
條件是true的時(shí)候重復(fù)執(zhí)行的代碼段
}
2、do-while
do{
代碼段 - 先執(zhí)行一次,然后判斷條件,后續(xù)是否執(zhí)行就看條件是否為true
}while(條件)
3、for
for(初始值定義語(yǔ)法; 條件; 變化) {
條件為true的時(shí)候重復(fù)執(zhí)行的代碼段
}
重點(diǎn):循環(huán)執(zhí)行的過(guò)程
四、函數(shù)
理解:存儲(chǔ)一段代碼的容器
定義語(yǔ)法:
function 函數(shù)名(形參1, 形參2, ...) { // 形參就是變量名
// 形參就相當(dāng)于在函數(shù)內(nèi)提前定義好的變量
// 如果沒(méi)有實(shí)參給形參賦值 - 形參默認(rèn)是undefined
// 形參可以直接給賦值 - 形參有默認(rèn)值 - 只能放在最后
代碼段
// 如果函數(shù)調(diào)用后需要得到一個(gè)結(jié)果 - 必須return 結(jié)果
// return 可以阻止代碼向下執(zhí)行
}
函數(shù)名的規(guī)則:跟變量名的規(guī)則一樣
調(diào)用語(yǔ)法:
var 變量 = 函數(shù)名(實(shí)參1, 實(shí)參2, ...)
<font color="red">**預(yù)解析: **</font>
概念:代碼在執(zhí)行之前先進(jìn)行解析
過(guò)程:從當(dāng)前作用域找所有變量定義和函數(shù)定義,找到后將變量定義和函數(shù)定義的代碼提升到當(dāng)前作用域的最前面。代碼按照提升后的順序執(zhí)行。
注意事項(xiàng):
- 只提升定義,不提升賦值
- 當(dāng)變量名和函數(shù)名同名,保留函數(shù),忽略變量
- 預(yù)解析一定在執(zhí)行之前 - 不會(huì)執(zhí)行的代碼中如果有變量和函數(shù)的定義,也會(huì)預(yù)解析
- 全局有全局預(yù)解析,局部也有局部的預(yù)解析
- 局部如果有形參,先給形參賦值,再進(jìn)行預(yù)解析,且預(yù)解析的函數(shù)跟形參同名,函數(shù)會(huì)覆蓋掉形參的值
- 代碼報(bào)錯(cuò)以后的代碼就不再執(zhí)行了 - 如果代碼中有報(bào)錯(cuò),就無(wú)法阻止默認(rèn)行為了
- 連等特殊語(yǔ)法:var a = b = 9 相當(dāng)于:var a = 9 b = 9
函數(shù)的本質(zhì):就是一個(gè)特殊變量,存儲(chǔ)了一段代碼,可以通過(guò)變量名()執(zhí)行這段代碼
匿名函數(shù):將一個(gè)函數(shù)賦值給變量使用 - 這個(gè)變量的類型是function,值就是這一段代碼 - 原本函數(shù)中的名字就失效了 - 這樣沒(méi)有名字的函數(shù)就叫匿名函數(shù)
匿名函數(shù)作用:
將匿名函數(shù)賦值給變量使用
-
自調(diào)用
(function(形參) { })(實(shí)參)
<font color="red">作用域</font>
概念:能起到作用的區(qū)域
分類:全局和局部
在全局中定義的變量叫全局變量 - 可以在任何地方使用
在局部中定義的變量叫局部變量 - 只能在局部中使用
重點(diǎn):全局不能訪問(wèn)局部變量,局部可以訪問(wèn)全局變量
作用域鏈:作用域會(huì)發(fā)生嵌套,這樣形成一條鏈?zhǔn)浇Y(jié)構(gòu)叫作用域鏈。
作用域鏈的規(guī)則:
- 將一個(gè)變量當(dāng)做具體數(shù)據(jù)使用(輸出、讓他去運(yùn)算)的時(shí)候,先在當(dāng)前作用域中找這個(gè)變量的定義,如果沒(méi)有,就去上級(jí)作用域中找,。。。直到全局,全局沒(méi)找到,報(bào)錯(cuò):XX is not defined
- 給一個(gè)變量賦值,先在當(dāng)前作用域中找變量的定義,如果沒(méi)有,就去上級(jí)作用域中找,。。。直到全局,全局沒(méi)找到,就在全局定義這個(gè)變量并賦值 - 省略var定義變量
遞歸函數(shù):
概念:在函數(shù)內(nèi)調(diào)用自己 - 形成循環(huán)
注意事項(xiàng):一定要添加停止的條件
事件:
給標(biāo)簽添加行為。
標(biāo)簽.on類型 = 一段函數(shù)代碼
一段函數(shù)代碼可以是匿名函數(shù),也可以用函數(shù)名表示。一定不是函數(shù)調(diào)用的語(yǔ)法。