JS高級(jí)程序設(shè)計(jì)選讀 筆記

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ù)來了,得忙啦!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市模软,隨后出現(xiàn)的幾起案子伟骨,更是在濱河造成了極大的恐慌,老刑警劉巖燃异,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件携狭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡回俐,警方通過查閱死者的電腦和手機(jī)逛腿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門稀并,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人单默,你說我怎么就攤上這事碘举。” “怎么了雕凹?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵殴俱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我枚抵,道長(zhǎng)线欲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任汽摹,我火速辦了婚禮李丰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逼泣。我一直安慰自己趴泌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布拉庶。 她就那樣靜靜地躺著嗜憔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氏仗。 梳的紋絲不亂的頭發(fā)上吉捶,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音皆尔,去河邊找鬼呐舔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛慷蠕,可吹牛的內(nèi)容都是我干的珊拼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼流炕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼澎现!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起每辟,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤昔头,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后影兽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莱革,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年峻堰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讹开。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捐名,死狀恐怖旦万,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情镶蹋,我是刑警寧澤成艘,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站贺归,受9級(jí)特大地震影響淆两,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拂酣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一秋冰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧婶熬,春花似錦剑勾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饺谬,卻和暖如春捂刺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背商蕴。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工叠萍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绪商。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓苛谷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親格郁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腹殿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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