基礎(chǔ)語法部分
語句和表達(dá)式
語句(statement)
是為了完成某種任務(wù)而進(jìn)行的操作奔则,通常以分號結(jié)尾蛮寂,一個分號就表示一個語句結(jié)束。
表達(dá)式(expression)
易茬,指一個為了得到返回值的計(jì)算式酬蹋,不需要分號結(jié)尾。
兩者的區(qū)別在于抽莱,語句主要為了進(jìn)行某種操作范抓,一般情況下不需要返回值;表達(dá)式則是為了得到返回值食铐,一定會返回一個值匕垫。
變量
量是對“值”的引用,使用變量等同于引用一個值虐呻。
JavaScript引擎的工作方式是象泵,先解析代碼,獲取所有被聲明的變量斟叼,然后再一行一行地運(yùn)行偶惠。這造成的結(jié)果,就是所有的變量的聲明語句朗涩,都會被提升到代碼的頭部忽孽,這就叫做變量提升(hoisting)。
Note
:變量提升只對var命令聲明的變量有效谢床。
區(qū)塊
JavaScript使用大括號兄一,將多個相關(guān)的語句組合在一起,稱為“區(qū)塊”(block),區(qū)塊不構(gòu)成單獨(dú)的作用域(scope)识腿。也就是說出革,區(qū)塊中的變量與區(qū)塊外的變量,屬于同一個作用域覆履。
因此蹋盆,單獨(dú)使用的區(qū)塊意義不大费薄,區(qū)塊往往用來構(gòu)成例如如for硝全、if、while等其他更復(fù)雜的語法結(jié)構(gòu)楞抡。
數(shù)據(jù)類型
JavaScript的數(shù)據(jù)類型可以分為以下幾種:
- 基本類型
1伟众、 數(shù)值(number)
2、 字符串(string)
3召廷、 布爾值(boolean) - 復(fù)雜類型
4凳厢、 對象(object)
5账胧、 數(shù)組(array)
6、 函數(shù)(function) - 特殊類型
7先紫、 undefined
8治泥、 null
typeof運(yùn)算符
typeof運(yùn)算符可以返回一個值的數(shù)據(jù)類型,可以用來檢查一個沒有聲明的變量遮精,而不報錯:
if (typeof a === "undefined") {
.....
}
null與undefined
null表示空值居夹,即該處的值現(xiàn)在為空,例如函數(shù)傳參本冲。
undefined表示“未定義”准脂。
布爾值轉(zhuǎn)換
undefined、null檬洞、false狸膏、0、NaN以及空字符會被自動轉(zhuǎn)為布爾值false添怔,其余值包括空數(shù)組和空對象都會轉(zhuǎn)換為true湾戳。
數(shù)值
JavaScript內(nèi)部,所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲存广料,即使整數(shù)也是如此院塞。
Number.MAX_VALUE
與Number.MIN_VALUE
表示了最大值和最小值。
NaN是JavaScript的特殊值性昭,表示“非數(shù)字”(Not a Number)拦止,主要出現(xiàn)在將字符串解析成數(shù)字出錯的場合。它不等于任何值糜颠,包括它本身汹族。可以通過isNaN
函數(shù)來判斷變量是否是NaN(最好先判斷一下變量類型)其兴,也可以利用NaN顶瞒!=NaN的特性來判斷:
function IsNaN(value) {
return value !== value;
}
字符串
字符串可以被視為字符數(shù)組,但是無法改變字符串之中的單個字符元旬。同樣榴徐,字符串也無法直接使用數(shù)組的方法,必須通過call方法間接使用匀归。在JavaScript引擎內(nèi)部坑资,所有字符都用Unicode表示,每個字符在JavaScript內(nèi)部都是以16位的UTF-16格式儲存穆端。
Base64
Base64是一種編碼方法袱贮,可以將任意字符轉(zhuǎn)成可打印字符。使用這種編碼方法体啰,主要不是為了加密攒巍,而是為了不出現(xiàn)特殊字符嗽仪,簡化程序的處理。
JavaScript提供了用于Base64轉(zhuǎn)碼ASCII字符串的相關(guān)方法:
btoa():字符串或二進(jìn)制值轉(zhuǎn)為Base64編碼
atob():Base64編碼轉(zhuǎn)為原來的編碼
而對于非ASCII編碼的字符串柒莉,必須中間插入一個轉(zhuǎn)碼環(huán)節(jié):
function b64Encode(str) {
return btoa(encodeURIComponent(str));
}
function b64Decode(str) {
return decodeURIComponent(atob(str));
}
對象
JavaScript的所有數(shù)據(jù)都可以被視為對象闻坚。創(chuàng)建對象的方法可以分為三種:
var o1 = {};
var o2 = new Object();
var o3 = Object.create(null);
對象的所有鍵名都是字符串,JavaScript規(guī)定兢孝,如果行首是大括號鲤氢,一律解釋為語句(即代碼塊)。如果要解釋為表達(dá)式(即對象)西潘,必須在大括號前加上圓括號卷玉。
數(shù)組
在JavaScript中,任何類型都可以被放進(jìn)數(shù)組喷市。而本質(zhì)上相种,數(shù)組是一種特殊的對象,因此品姓,使用typeof
運(yùn)算符獲得的結(jié)果仍是object
寝并,其特殊性體現(xiàn)在,它的鍵名是按次序排列的一組整數(shù)腹备,而且在取鍵值時候同樣轉(zhuǎn)換為字符串衬潦。
數(shù)組的length屬性,返回數(shù)組的成員數(shù)量植酥,它是一個動態(tài)的值镀岛,因?yàn)閿?shù)組的key不需要連續(xù),所以length值等于鍵名中的最大整數(shù)加上1友驮。
length屬性是可寫的漂羊。如果人為設(shè)置一個小于當(dāng)前成員個數(shù)的值,該數(shù)組的成員會自動減少到length設(shè)置的值卸留。將數(shù)組清空的一個有效方法走越,就是將length屬性設(shè)為0。
值得注意的是耻瑟,由于數(shù)組本質(zhì)上是對象的一種旨指,所以我們可以為數(shù)組添加屬性,但是這不影響length屬性的值喳整。
檢查某個鍵名是否存在的運(yùn)算符in
谆构,適用于對象,也適用于數(shù)組算柳。如果鍵名處是空位低淡,則返回false。
for...in
循環(huán)不僅可以遍歷對象喂江,也可以遍歷數(shù)組又固,畢竟數(shù)組只是一種特殊對象.
Note:
但是菊卷,for...in
不僅會遍歷數(shù)組所有的數(shù)字鍵,還會遍歷非數(shù)字鍵猪杭,因此更推薦使用for
來遍歷數(shù)組。
當(dāng)數(shù)組的某個位置是空元素妥衣,即兩個逗號之間沒有任何值皂吮,我們稱該數(shù)組存在空位,對其讀取的返回值為undefined
税手。length屬性不過濾空位蜂筹,因此,使用for
進(jìn)行數(shù)組遍歷芦倒,要注意處理艺挪。
如果是空位,使用數(shù)組的forEach方法兵扬、for...in結(jié)構(gòu)麻裳、以及Object.keys方法進(jìn)行遍歷,空位都會被跳過器钟。但如果某個位置是undefined津坑,遍歷的時候就不會被跳過。
函數(shù)
在JavaScript中傲霸,函數(shù)也是一種對象疆瑰。它的length
屬性返回函數(shù)預(yù)期傳入的參數(shù)個數(shù),即函數(shù)定義之中的參數(shù)個數(shù)昙啄。
Javascript只有兩種作用域:一種是全局作用域乃摹,變量在整個程序中一直存在,所有地方都可以讀雀啤孵睬;另一種是函數(shù)作用域,變量只在函數(shù)內(nèi)部存在伶跷。
函數(shù)本身也是一個值掰读,也有自己的作用域。它的作用域與變量一樣叭莫,就是其聲明時所在的作用域蹈集,與其運(yùn)行時所在的作用域無關(guān)。
函數(shù)參數(shù)如果是原始類型的值(數(shù)值雇初、字符串拢肆、布爾值),傳遞方式是傳值傳遞;如果函數(shù)參數(shù)是復(fù)合類型的值(數(shù)組郭怪、對象支示、其他函數(shù)),傳遞方式是傳址傳遞鄙才。
JavaScript通過arguments
對象來為函數(shù)提供不定數(shù)目的參數(shù)颂鸿,該對象包含了函數(shù)運(yùn)行時的所有參數(shù)。通過arguments對象的length屬性攒庵,可以判斷函數(shù)調(diào)用時到底帶幾個參數(shù)嘴纺。
arguments
對象并不是一個數(shù)組,數(shù)組專有的方法不能在arguments對象上直接使用浓冒。而是通過apply
函數(shù)或者將它轉(zhuǎn)化為數(shù)組來使用栽渴。
arguments
對象帶有一個callee屬性,返回它所對應(yīng)的原函數(shù)稳懒,可以通過arguments.callee
闲擦,達(dá)到調(diào)用函數(shù)自身的目的。
閉包就是定義在函數(shù)內(nèi)部的函數(shù)僚祷,即能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)佛致。在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁辙谜,最大的特點(diǎn)俺榆,就是它可以“記住”誕生的環(huán)境。
閉包的最大用處有兩個装哆,一個是可以讀取函數(shù)內(nèi)部的變量罐脊,另一個就是讓這些變量始終保持在內(nèi)存中,即閉包可以使得它誕生環(huán)境一直存在蜕琴,因此萍桌,閉包可以封裝對象的私有屬性和私有方法。
note:
外層函數(shù)每次運(yùn)行凌简,都會生成一個新的閉包上炎,而這個閉包又會保留外層函數(shù)的內(nèi)部變量,所以內(nèi)存消耗很大雏搂。
運(yùn)算符
加法運(yùn)算符可以完成兩種運(yùn)算藕施,既可以處理算術(shù)的加法,也可以用作字符串連接凸郑。如果運(yùn)算子是對象裳食,先自動轉(zhuǎn)成原始類型的值。只要有一個運(yùn)算子是字符串芙沥,則兩個運(yùn)算子都轉(zhuǎn)為字符串诲祸,執(zhí)行字符串連接運(yùn)算浊吏。否則,兩個運(yùn)算子都轉(zhuǎn)為數(shù)值救氯,執(zhí)行加法運(yùn)算找田。
相等運(yùn)算符==
比較兩個值是否相等,嚴(yán)格相等運(yùn)算符===
比較它們是否為“同一個值”径密。
如果兩個值不是同一類型午阵,嚴(yán)格相等運(yùn)算符===
直接返回false躺孝,而相等運(yùn)算符==
會將它們轉(zhuǎn)化成同一個類型享扔,再用嚴(yán)格相等運(yùn)算符進(jìn)行比較。
對于嚴(yán)格相等運(yùn)算符:
- 兩個值的類型不同植袍,直接返回false.
- 同一類型的原始類型的值惧眠,相同就返回true,否則返回false于个。
- 復(fù)合類型的數(shù)據(jù)比較時氛魁,不是比較它們的值是否相等,而是比較它們是否指向同一個對象厅篓。
對于相等運(yùn)算符:
- 原始類型的數(shù)據(jù)會轉(zhuǎn)換成數(shù)值類型再進(jìn)行比較
- 對象與原始類型的值比較時秀存,對象轉(zhuǎn)化成原始類型的值,再進(jìn)行比較羽氮。
- undefined和null與其他類型的值比較時或链,結(jié)果都為false,它們互相比較時結(jié)果為true档押。
取反運(yùn)算符有轉(zhuǎn)換數(shù)據(jù)類型的作用澳盐,!!x 等同于Boolean(x).
左移運(yùn)算符<<
表示將一個數(shù)的二進(jìn)制值向左移動指定的位數(shù),尾部補(bǔ)0令宿,即乘以2的指定次方(最高位即符號位不參與移動)叼耙。
右移運(yùn)算符>>
表示將一個數(shù)的二進(jìn)制值向右移動指定的位數(shù),頭部補(bǔ)0粒没,即除以2的指定次方(最高位即符號位不參與移動)筛婉。
帶符號位的右移運(yùn)算符>>>
表示將一個數(shù)的二進(jìn)制形式向右移動,包括符號位也參與移動癞松,頭部補(bǔ)0爽撒。
void運(yùn)算符的作用是執(zhí)行一個表達(dá)式,然后不返回任何值拦惋,或者說返回undefined匆浙。
數(shù)據(jù)類型轉(zhuǎn)換
強(qiáng)制轉(zhuǎn)換主要指使用Number
、String
和Boolean
三個構(gòu)造函數(shù)厕妖,手動將各種類型的值首尼,轉(zhuǎn)換成數(shù)字、字符串或者布爾值。
使用Number
函數(shù)软能,可以將任意類型的值轉(zhuǎn)化成數(shù)值迎捺。對于原始類型(字符串、布爾值查排、undefined和null)凳枝,它們都能被Number轉(zhuǎn)成數(shù)值或NaN。對于復(fù)雜類型跋核,默認(rèn)情況下岖瑰,會返回NaN。
使用Boolean函數(shù)砂代,可以將任意類型的變量轉(zhuǎn)為布爾值蹋订。除了undefined
,null
刻伊,NaN
,0
,±0
以及空字符串會返回false之外露戒,其余的都返回true。