1.函數(shù)的參數(shù)
函數(shù)的參數(shù)在函數(shù)內(nèi)是通過一個(gè)數(shù)組表示的,函數(shù)接收的始終都是這個(gè)數(shù)組娃循,而不管數(shù)組中包含哪些參數(shù)征懈,在函數(shù)實(shí)體內(nèi)我們可以通過arguments這個(gè)對(duì)象來訪問這個(gè)參數(shù)數(shù)組。arguments與數(shù)組類似醋拧,但并不是數(shù)組實(shí)例卿嘲。arguments中的值永遠(yuǎn)與對(duì)應(yīng)的命名參數(shù)的值保持同步颂斜,他們的內(nèi)存空間是獨(dú)立的,但是值會(huì)同步腔寡。還有焚鲜,arguments對(duì)象的長(zhǎng)度取決于實(shí)際傳入的參數(shù)個(gè)數(shù),而不是定義函數(shù)是的命名參數(shù)的個(gè)數(shù)放前。
2.變量,作用域和內(nèi)存問題
2.1????JS中包含兩種不同類型的值糯彬,基本類型值和引用類型值凭语,基本類型值指的是簡(jiǎn)單的數(shù)據(jù)段,引用類型值指的是可能由多個(gè)值構(gòu)成的對(duì)象撩扒。引用類型值是保存在內(nèi)存中的object似扔,在復(fù)制和保存對(duì)象某個(gè)變量時(shí),實(shí)際上是在操作對(duì)象的引用搓谆,而不是實(shí)際的object炒辉,但是在為對(duì)象添加屬性時(shí),操作的是實(shí)際的object泉手。當(dāng)從一個(gè)變量向另一個(gè)變量復(fù)制引用類型的值時(shí)黔寇,復(fù)制的值實(shí)際上是個(gè)指針,這個(gè)指針指向儲(chǔ)存在堆中的一個(gè)對(duì)象斩萌,那么缝裤,兩個(gè)變量實(shí)質(zhì)上引用了堆中的同一個(gè)對(duì)象,這時(shí)候改變其中一個(gè)的值颊郎,也會(huì)影響另外一個(gè)憋飞。
2.2 ? ?傳遞參數(shù)
JS中所有函數(shù)的參數(shù)都是按值傳遞的,就是說姆吭,把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的值榛做,就是和把一個(gè)變量復(fù)制給另外一個(gè)變量一樣,這里搞清楚,值上面已經(jīng)說過检眯,有兩種不同類型的值升敲。基本類型的值從函數(shù)外部復(fù)制到函數(shù)內(nèi)部所做的修改都不會(huì)影響到函數(shù)外部的值轰传,他們僅僅是值相同驴党;引用類型的值從函數(shù)外部復(fù)制都函數(shù)內(nèi)部,但其實(shí)只是復(fù)制了指針获茬,他們都指向內(nèi)存中的一個(gè)object港庄,因此,增加屬性或者修改屬性恕曲,操作的都是同一個(gè)內(nèi)存中的object鹏氧。
2.3 ? ?執(zhí)行環(huán)境及作用域
????執(zhí)行環(huán)境定義了變量或者函數(shù)有權(quán)訪問的其他數(shù)據(jù),每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象佩谣,環(huán)境中所定義的所有變量和函數(shù)都會(huì)保存在這個(gè)執(zhí)行環(huán)境中把还。在Web瀏覽器中,全局執(zhí)行環(huán)境被認(rèn)為是window對(duì)象,所以所有的全局變量和方法都是作為window對(duì)象的屬性和方法創(chuàng)建的茸俭。某個(gè)執(zhí)行環(huán)境中的代碼被執(zhí)行完畢后吊履,該環(huán)境被銷毀,保存在其中的所有變量和函數(shù)定義也隨之銷毀(全局執(zhí)行環(huán)境直到應(yīng)用程序退出—例如關(guān)閉網(wǎng)頁瀏覽器時(shí)才會(huì)被銷毀)调鬓。
? ? 每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境艇炎,當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會(huì)被推入一個(gè)環(huán)境棧中腾窝,執(zhí)行完之后缀踪,棧將其退出,把控制權(quán)交給之前的執(zhí)行環(huán)境虹脯。
????作用域鏈驴娃,就是所有執(zhí)行環(huán)境從外到內(nèi)連城一條線,內(nèi)部的執(zhí)行環(huán)境可以通過作用于鏈訪問所有的外部執(zhí)行環(huán)境循集,外部的不能訪問內(nèi)部的唇敞。
? ? JS中沒有塊級(jí)作用域,在其他類C的語言中暇榴,由{}花括號(hào)封閉的代碼塊都有自己的作用域厚棵,而JS中沒有,JS中只有執(zhí)行環(huán)境蔼紧。比如if語句中聲明的變量會(huì)被當(dāng)做全局變量婆硬,for循環(huán)語句中聲明的變量也會(huì)被當(dāng)做全局變量。
? ? 查詢標(biāo)識(shí)符奸例,就是查詢變量或方法彬犯,當(dāng)在某個(gè)執(zhí)行環(huán)境中引用了另一個(gè)標(biāo)識(shí)符時(shí)向楼,必須通過搜索來確定該標(biāo)識(shí)符實(shí)際代表什么。執(zhí)行環(huán)境由內(nèi)而外搜索谐区。
? ? 優(yōu)化知識(shí):變量查詢需要付出代價(jià)湖蜕,訪問局部變量要比全局變量快,因?yàn)椴挥孟蛏纤阉髯饔面溗瘟校琂S引擎在優(yōu)化標(biāo)識(shí)符查詢方面做得不錯(cuò)昭抒,因此這個(gè)差別將來就可以忽略不計(jì)了。
? ? JS中垃圾回收機(jī)制:JS中具有自動(dòng)垃圾回收機(jī)制炼杖,回收方法有兩種灭返,一種是標(biāo)記清除,通過添加標(biāo)記和去除標(biāo)記識(shí)別哪些變量該刪除坤邪。還有一種方法是引用計(jì)數(shù)熙含,跟蹤每個(gè)值被引用的次數(shù),當(dāng)聲明了一個(gè)變量并將一個(gè)引用類型值賦給該變量時(shí)艇纺,則這個(gè)值得引用次數(shù)加一怎静,如果包含對(duì)這個(gè)值引用的變量又取了別的值,則這個(gè)值得引用次數(shù)減一黔衡,為0時(shí)蚓聘,就該回收了,這樣子會(huì)有bug出現(xiàn)员帮,例如在函數(shù)中聲明兩個(gè)局部變量或粮,都賦值為object實(shí)例,然后相互引用捞高,這樣子這倆貨的引用次數(shù)永遠(yuǎn)不可能為0。
? ? 管理內(nèi)存渣锦,確保占用最少的內(nèi)存能讓頁面獲得更好的性能硝岗。一旦數(shù)據(jù)不再有用,最好通過將其值設(shè)置為null來釋放其引用袋毙,這個(gè)方法叫—解除引用型檀,解除引用并不意味著自動(dòng)回收該值所占用的內(nèi)存,真正作用是讓值脫離執(zhí)行環(huán)境听盖,以便垃圾回收機(jī)制下次運(yùn)行時(shí)將其回收胀溺。
內(nèi)容小結(jié):
JS變量用來保存兩種類型的值:基本類型值和引用類型值,基本類型值來源于五大基本數(shù)據(jù)類型皆看。這兩種值具有以下特點(diǎn):
? ? 1.基本類型值在內(nèi)存中占據(jù)固定大小的空間仓坞,因此被保存在棧內(nèi)存中(后續(xù)再了解內(nèi)存的概念);
? ? 2.從一個(gè)變量向另一個(gè)變量復(fù)制基本類型值腰吟,會(huì)創(chuàng)建這個(gè)值得一個(gè)副本无埃;
? ? 3.引用類型的值是對(duì)象徙瓶,保存在堆內(nèi)存中;
? ? 4.包含引用引用類型值的變量實(shí)際上包含的并不是對(duì)象本身嫉称,而是一個(gè)指向該對(duì)象的指針侦镇;
? ? 5.從一個(gè)變量向另一個(gè)變量復(fù)制引用類型的值,復(fù)制的其實(shí)是指針织阅,因此兩個(gè)變量最終都指向一個(gè)對(duì)象壳繁;
還有就是執(zhí)行環(huán)境和作用域鏈的問題,以及垃圾回收機(jī)制及回收方法荔棉。
3.引用類型
????引用類型的值(對(duì)象)是引用類型的一個(gè)實(shí)例闹炉,引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起江耀,它也常被稱為類剩胁,但這種稱呼并不妥當(dāng),雖然JS從技術(shù)上講是一門面向?qū)ο笳Z言祥国,但是它不具備傳統(tǒng)面向?qū)ο笳Z言所支持的類和接口等基本結(jié)構(gòu)昵观,引用類型有時(shí)候也被稱為對(duì)象定義,因?yàn)樗枋龅氖且活悓?duì)象所具有的屬性和方法舌稀,引用類型和類看起來相似啊犬,但它們并不是相同的概念。
? ? 3.1 ? ?object類型
創(chuàng)建實(shí)例壁查,兩種基本方法觉至,第一種是使用new操作符后跟object構(gòu)造函數(shù),另一種是使用對(duì)象字面量方法睡腿,在通過使用對(duì)象字面量定義對(duì)象時(shí)语御,實(shí)際上并不會(huì)調(diào)用object構(gòu)造函數(shù)。
訪問對(duì)象屬性席怪,第一種应闯,點(diǎn)表示法,第二種挂捻,方括號(hào)表示法碉纺。使用方括號(hào)語法時(shí),訪問的屬性名要以字符串的形式放在方括號(hào)內(nèi)刻撒,可以是變量骨田。
? ? 3.2 ? ?Array類型
創(chuàng)建方式也是兩種,構(gòu)造函數(shù)和字面量声怔。使用構(gòu)造函數(shù)方式時(shí)态贤,可以省略new操作符,使用字面量時(shí)捧搞,也不會(huì)調(diào)用Array構(gòu)造函數(shù)方法抵卫。
? ? 3.2.1 ? ?檢測(cè)數(shù)組
Array.isArray()方法狮荔,檢測(cè)是不是數(shù)組
? ? 3.2.2 ? ?轉(zhuǎn)換方法
如前所述,所有對(duì)象都具有toLocaleString()介粘,toString()殖氏,valueOf()方法。
3.2.3 ? ?push()和pop()(棧方法)
之所以稱為棧方法姻采,是因?yàn)闂J且环N后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)雅采。
push()方法接受任意數(shù)量的參數(shù),逐個(gè)添加到數(shù)組末尾慨亲,并返回修改后的數(shù)組長(zhǎng)度婚瓜;
pop()方法移除數(shù)組最后一項(xiàng)并返回。
3.2.4 ? ?shift()和unshift()方法(隊(duì)列方法)
隊(duì)列數(shù)據(jù)結(jié)構(gòu)訪問規(guī)則是先進(jìn)先出刑棵。
shift()移除數(shù)組第一項(xiàng)并返回巴刻,unshift()添加任意項(xiàng)到數(shù)組前面,并返回?cái)?shù)組新長(zhǎng)度蛉签。
3.2.5 ? ?重排序方法
reverse()方法和sort()方法
reverse()方法是反轉(zhuǎn)數(shù)組排序胡陪,僅此而已。
sort()接受一個(gè)比較函數(shù)作為參數(shù)來排序碍舍,比較函數(shù)來接受兩個(gè)參數(shù)柠座,第一個(gè)參數(shù)應(yīng)該位于第二個(gè)之前,則返回負(fù)數(shù)片橡,如果相等妈经,則返回0,之后則返回正數(shù)捧书,從而實(shí)現(xiàn)升序或降序排列數(shù)組吹泡。
3.2.6 ? ?數(shù)組操作
concat(),如果沒有參數(shù)经瓷,則復(fù)制當(dāng)前數(shù)組并返回副本荞胡,如果有參數(shù)(一個(gè)或多個(gè)數(shù)組),則合并數(shù)組了嚎,返回新的數(shù)組。
slice()廊营,接受1或2個(gè)參數(shù)歪泳,1個(gè)參數(shù),返回當(dāng)前參數(shù)指定位置到數(shù)組末尾的所有項(xiàng)的數(shù)組露筒,兩個(gè)參數(shù)呐伞,返回指定位置間所有項(xiàng),包括第一項(xiàng)不包括最后一項(xiàng)的數(shù)組慎式。如果參數(shù)為負(fù)數(shù)伶氢,則用數(shù)組長(zhǎng)度加上這個(gè)負(fù)數(shù)來確定位置趟径,如果第二個(gè)參數(shù)小于第一個(gè),則返回空數(shù)組癣防。
強(qiáng)大的splice()方法
刪除:兩個(gè)參數(shù)蜗巧,起始項(xiàng)和要?jiǎng)h除的項(xiàng)的數(shù)目。
插入:n個(gè)參數(shù)蕾盯,n>2,起始項(xiàng)幕屹,要?jiǎng)h除的項(xiàng),之后的就是要插入的項(xiàng)级遭,有多少就都以參數(shù)形式傳入望拖。
替換:和第二個(gè)方法一樣,不過要?jiǎng)h除的項(xiàng)參數(shù)不為0就可以挫鸽。
注意说敏,splice這個(gè)方法返回的是一個(gè)數(shù)組,包含從原數(shù)組刪除的項(xiàng)丢郊,如果沒有盔沫,則返回空數(shù)組。
3.2.7 ? ?查找位置方法
indexOf()方法(從前往后)和lastIndexOf()方法(從后往前)蚂夕,這兩個(gè)方法都接受兩個(gè)參數(shù)迅诬,要查找的項(xiàng)和起始位置的索引。若有婿牍,則返回索引侈贷,沒有則返回-1。
關(guān)于數(shù)組的還有很多方法等脂。
4 ? ?閉包
經(jīng)常搞不清楚閉包和匿名函數(shù)的概念俏蛮,閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的常見方式就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另外一個(gè)函數(shù)上遥。內(nèi)部函數(shù)即使被return或者在其他地方被調(diào)用搏屑,仍然可以訪問外部函數(shù)的參數(shù),因?yàn)閮?nèi)部函數(shù)的作用域鏈中包含了外部函數(shù)的作用域粉楚,其中的細(xì)節(jié)必須從理解函數(shù)被調(diào)用的時(shí)候發(fā)生了什么入手辣恋。
------未完待更,公司業(yè)務(wù)來了,得忙啦!