JavaScript學(xué)習(xí)筆記(語法部分)

基礎(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_VALUENumber.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)換主要指使用NumberStringBoolean三個構(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)為布爾值蹋订。除了undefinednull刻伊,NaN,0,±0以及空字符串會返回false之外露戒,其余的都返回true。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捶箱,一起剝皮案震驚了整個濱河市智什,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丁屎,老刑警劉巖荠锭,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悦屏,居然都是意外死亡节沦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門础爬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甫贯,“玉大人,你說我怎么就攤上這事看蚜〗懈椋” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵供炎,是天一觀的道長渴逻。 經(jīng)常有香客問我,道長音诫,這世上最難降的妖魔是什么惨奕? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮竭钝,結(jié)果婚禮上梨撞,老公的妹妹穿的比我還像新娘雹洗。我一直安慰自己,他們只是感情好卧波,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布时肿。 她就那樣靜靜地躺著,像睡著了一般港粱。 火紅的嫁衣襯著肌膚如雪螃成。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天查坪,我揣著相機(jī)與錄音寸宏,去河邊找鬼。 笑死咪惠,一個胖子當(dāng)著我的面吹牛击吱,可吹牛的內(nèi)容都是我干的淋淀。 我是一名探鬼主播遥昧,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼朵纷!你這毒婦竟也來了炭臭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤袍辞,失蹤者是張志新(化名)和其女友劉穎鞋仍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搅吁,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡威创,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谎懦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肚豺。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖界拦,靈堂內(nèi)的尸體忽然破棺而出吸申,到底是詐尸還是另有隱情,我是刑警寧澤享甸,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布截碴,位于F島的核電站,受9級特大地震影響蛉威,放射性物質(zhì)發(fā)生泄漏日丹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一蚯嫌、第九天 我趴在偏房一處隱蔽的房頂上張望哲虾。 院中可真熱鬧割坠,春花似錦、人聲如沸妒牙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湘今。三九已至敢朱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摩瞎,已是汗流浹背拴签。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旗们,地道東北人蚓哩。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像上渴,于是被迫代替她去往敵國和親岸梨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

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