語法
- /*形式的注釋因?yàn)檎齽t表達(dá)式中可能會(huì)出現(xiàn)這些字符,所以建議都使用//來進(jìn)行注釋
- 數(shù)字在JS內(nèi)部統(tǒng)一表示為64位的浮點(diǎn)數(shù),所以1和1.0的值是相同的
- NaN不等于任何值,包括它自己
- 所有字符都是16位的,沒有字符類型,可以通過包含一個(gè)字符的字符串表示
- 常用轉(zhuǎn)義字符:" ' \ / \b \f \n \r \t \uxxxx
- 字符串是不可變的,兩個(gè)包含著完全相同的字符且字符順序也相同的字符串認(rèn)為是相同的字符串(===相等)
- 在函數(shù)內(nèi)部用var聲明的變量是該函數(shù)的私有變量
- 只有函數(shù)作用域和全局作用域,所以花括號(hào)式的代碼塊不會(huì)創(chuàng)建新的作用域
- 除了false、null、undefined、空字符串、0、NaN外,其他值都為真
- switch語句執(zhí)行表達(dá)式,對(duì)產(chǎn)生的數(shù)字或字符串進(jìn)行case匹配,case表達(dá)式不一定必須是常量
- for in語句枚舉對(duì)象的所有屬性名或鍵名
- switch、while、for和do語句可以有個(gè)前置標(biāo)簽,然后可以用break <label>來退出該該標(biāo)簽的語句
- typeof的結(jié)果:number、string、boolean、undefined、function和object(typeof null結(jié)果為object)
- 只有兩個(gè)運(yùn)算數(shù)都為數(shù)字時(shí),+才是加法運(yùn)算
對(duì)象
- 對(duì)象是可變的"key/value"對(duì)的集合,除了數(shù)字、字符串、布爾值、null和undefined外,其他諸如數(shù)組、函數(shù)、正則表達(dá)式等值都是對(duì)象;盡管數(shù)字、字符串和布爾值擁有方法,但它們是不可變的,所以并不是對(duì)象
- 對(duì)象是屬性的容器,每個(gè)屬性都有名字和值,屬性名可以是包括空字符串在內(nèi)的任意字符串,屬性值可以是除undefined外的任何值
- 對(duì)象是無類型的,所以對(duì)新屬性的名字和值沒有限制
- 屬性名為一個(gè)合法的JS標(biāo)識(shí)符且不是保留字時(shí),在對(duì)象字面量中可以不用引號(hào)包括,在對(duì)象獲取屬性時(shí)可以用.來獲取(不然就得使用["name"]這樣的形式)
- 對(duì)undefined獲取屬性會(huì)拋出TypeError異常,可以先用&&運(yùn)算符來避免錯(cuò)誤
- 對(duì)象通過引用來傳遞,永遠(yuǎn)不會(huì)被復(fù)制
- 每個(gè)對(duì)象都連接到一個(gè)原型對(duì)象,通過對(duì)象字面量創(chuàng)建的對(duì)象連接到Object.prototype
- 對(duì)對(duì)象的改變,不會(huì)修改原型;只在獲取屬性時(shí),但是對(duì)象沒有時(shí),才會(huì)從原型鏈上去查找這個(gè)屬性(即為委托)
- 原型新增的屬性會(huì)立即對(duì)所有基于該原型創(chuàng)建的對(duì)象都可見
- 用hasOwnProperty方法可以判斷是否為對(duì)象獨(dú)有的屬性
- for in語句可用來遍歷對(duì)象的所有屬性名,包括原型中的屬性(前提是該屬性是可遍歷的)
- delete可以刪除對(duì)象的屬性,但不會(huì)刪除原型鏈中的屬性,所以可能會(huì)讓原型鏈中的屬性透現(xiàn)出來
函數(shù)
- 函數(shù)對(duì)象的原型對(duì)象是Function.prototype(它又連接到Object.prototype)
- 函數(shù)對(duì)象在創(chuàng)建時(shí)會(huì)配一個(gè)prototype屬性,其值為一個(gè)對(duì)象,該對(duì)象擁有一個(gè)constructor屬性,值為該函數(shù)
- 每個(gè)函數(shù)都接收兩個(gè)附加的參數(shù):this和arguments,其中this的值取決于調(diào)用模式(共有4中調(diào)用模式:方法調(diào)用模式、函數(shù)調(diào)用模式、構(gòu)造器調(diào)用模式和apply調(diào)用模式),this的綁定是遲綁定,在函數(shù)調(diào)用那一刻才決定
- 方法調(diào)用模式:函數(shù)作為對(duì)象的一個(gè)屬性時(shí),就稱為方法,通過.或[]來調(diào)用時(shí)就是方法調(diào)用,此時(shí)this被綁定到該對(duì)象
- 函數(shù)調(diào)用模式:非對(duì)象屬性時(shí),就當(dāng)作函數(shù),此時(shí)this被綁定到全局對(duì)象(方法內(nèi)部聲明的函數(shù)就無法通過this訪問方法所屬的對(duì)象,一般通過在方法多聲明一個(gè)that變量并賦值為this,然后在內(nèi)部函數(shù)使用that即可解決)
- 構(gòu)造器調(diào)用模式:帶上new來調(diào)用函數(shù)(構(gòu)造器函數(shù),一般約定首字母大寫),此時(shí)會(huì)創(chuàng)建一個(gè)新對(duì)象,其原型連接到函數(shù)的prototype屬性對(duì)象,另外函數(shù)的this會(huì)綁定到新對(duì)象上
- Apply調(diào)用模式:調(diào)用函數(shù)的apply方法,該方法第一個(gè)參數(shù)為要綁定給函數(shù)的this的值,第二個(gè)參數(shù)為一個(gè)參數(shù)數(shù)組
- 函數(shù)的隱藏參數(shù)arguments只是一個(gè)擁有l(wèi)ength屬性的類似數(shù)組的對(duì)象,并沒有任何數(shù)組的方法
- 帶new調(diào)用的函數(shù),如果返回值不是對(duì)象,則返回this(即新生成的對(duì)象)
- 通過throw來拋出一個(gè)包含name和message屬性的exception對(duì)象,try用于捕捉
- 可以給基本類型擴(kuò)充功能,例如給Object.prototype增加方法讓所有對(duì)象都可用,但是要在類庫混用的時(shí)候要注意,避免錯(cuò)誤覆蓋
- 因?yàn)镴S只有函數(shù)作用域和全局作用域,而沒有塊級(jí)作用域,所以盡量在函數(shù)體的頂部聲明函數(shù)中可能用到的所有變量
- 閉包使得內(nèi)部函數(shù)能訪問外部的實(shí)際變量(類似引用而非復(fù)制,需要復(fù)制的效果可以使用函數(shù)參數(shù)傳值的方式)
- 避免在循環(huán)中創(chuàng)建函數(shù)
- 模塊模式:一個(gè)定義了私有變量和函數(shù)的函數(shù);利用閉包,該函數(shù)內(nèi)部創(chuàng)建一個(gè)可以訪問私有變量的特權(quán)函數(shù),最后返回這個(gè)特權(quán)函數(shù)
數(shù)組
- JS的數(shù)組其實(shí)是類數(shù)組特性的對(duì)象
- 每個(gè)數(shù)組都有一個(gè)length屬性,其值是數(shù)組最大的整數(shù)屬性名加1,給數(shù)組增加一個(gè)非整數(shù)屬性時(shí),不會(huì)改變它的length
- 把length設(shè)小將會(huì)導(dǎo)致所有下標(biāo)大于等于新length的屬性被刪除
- 用delete刪除數(shù)組元素會(huì)導(dǎo)致空洞,一般使用splice方法
正則表達(dá)式
- 建議使用正則表達(dá)式字面量來創(chuàng)建正則表達(dá)式
- 用正則表達(dá)式字面量創(chuàng)建的RegExp對(duì)象共享同一個(gè)單例
- 需要轉(zhuǎn)義的字符:\ / [ ] ( ) { } ? + * | . ^ $
- .匹配除行結(jié)束符以外的任何字符