成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

理解javascript核心知識點

laznrbfe / 3173人閱讀

摘要:作用域鏈的作用就是做標(biāo)示符解析。事件循環(huán)還有個明顯的特點單線程。早期都是用作開發(fā),單線程可以比較好當(dāng)規(guī)避同步問題,降低了開發(fā)門檻。單線程需要解決的是效率問題,里的解決思想是異步非阻塞。

0、前言

本人在大學(xué)時非常癡迷java,認(rèn)為java就是世界上最好的語言,偶爾在項目中會用到一些javascript,但基本沒放在眼里。較全面的接觸javascript是在實習(xí)的時候,通過這次的了解發(fā)現(xiàn),javascript其實是一門非常優(yōu)秀而且有意思的語言,從那時開始喜歡上了這門語言。

javascript里面很多的概念和目前主流的語言是非常不一樣的,它更多的是繼承了函數(shù)式編程語言的特點。雖然語言的第一版的設(shè)計據(jù)說只花了七天時間,但其血統(tǒng)還是挺好的。個人認(rèn)為javascript之所以會經(jīng)久不衰并且應(yīng)用越來越廣泛,和其血統(tǒng)是離不開的,它可能剛好觸及到某些“本質(zhì)”的東西。當(dāng)然不是要鼓吹“javascript是世界上最好的語言”,javascript語言本身是有許多瑕疵的,這也是被許多人詬病的地方。它優(yōu)秀的地方設(shè)計得非常好用,能夠滿足絕大多數(shù)的使用場景,一些小瑕疵只要稍加注意,并不會產(chǎn)生太大的影響。

對于有一定編程經(jīng)驗的人來說,第一次接觸javascript一定會覺得非常簡單,會有似曾相識的感覺,但如果輕視它,不去理解它的核心特點,一定會受到懲罰,讓你一臉懵逼。本文就整理了幾個核心的需要理解的知識點,希望能夠幫助有編程基礎(chǔ)的初學(xué)者快速理解javascript。

1、數(shù)據(jù)類型

javascript數(shù)據(jù)類型設(shè)計得非常簡單,總共只有6中,分別是boolean、string、number、undefined、object,function。一般將能夠通過typeof運算符區(qū)分的歸為一種數(shù)據(jù)類型。其中object,function為引用類型,剩下都為基本類型。javascript的數(shù)據(jù)類型雖然簡單,但有幾個地方需要特別注意一下。

number:
number類型底層采用雙精度浮點數(shù)存儲,能夠表示整數(shù),也能表示小數(shù)。由于這個原因,number能夠安全表示的整數(shù)范圍是-9007199254740991 ~ 9007199254740991,超出則可能丟失精度。還比如0.1 + 0.2,其結(jié)果為:0.30000000000000004。number類型有個特殊值NaN,表示“不是個數(shù)字”,比如1/"a"就會返回NaN。

undefined:
這是一種非常特殊的數(shù)據(jù)類型,表示未賦值。變量或?qū)傩远x后未賦值就為undefined。這種數(shù)據(jù)類型用處不多,一般只是拿來區(qū)分有無賦值。

object:
object類型涵蓋的東西非常廣,Array,RegExp這些內(nèi)置類型的對象也是object類型。null是一個非常特殊的對象,表示空對象,和undefined很像,只不過null是對象類型。

function
函數(shù)雖然被當(dāng)做一種數(shù)據(jù)類型,但其本質(zhì)還是一種特殊的對象,是從Object繼承而來的。

2、函數(shù)及其運行時

個人認(rèn)為,函數(shù)是javascript里面設(shè)計最巧妙的一個地方,許多有意思的特性都是圍繞函數(shù)展開的,比如閉包和繼承等。javascript里的函數(shù)還是“一等公民”,能夠作為參數(shù)傳遞、返回值返回,使用上極其靈活。
理解函數(shù)的執(zhí)行首先要理解作用域的概念。在ES6之前,javascript里只有全局和函數(shù)作用域兩種作用域,到ES6才引入了塊級作用域。

函數(shù)在執(zhí)行時會創(chuàng)建一個執(zhí)行環(huán)境,push到執(zhí)行棧的頂端,執(zhí)行環(huán)境中就包含了當(dāng)前函數(shù)的作用域。作用域包含了當(dāng)前函數(shù)的局部變量以及內(nèi)置的變量比如this,arguments。函數(shù)作用域是在運行時確定的,非運行時討論作用域是沒有意義的。作用域是如何形成的?函數(shù)在定義時會有個[[scope]]的內(nèi)部屬性指向當(dāng)時的作用域,一旦函數(shù)開始執(zhí)行,它會創(chuàng)建一個新的作用域,并且用指針指向函數(shù)[[scope]]屬性指向的內(nèi)容,如此就形成了一條作用域鏈,作用域鏈的最外層是全局作用域。

作用域鏈的作用就是做標(biāo)示符解析。函數(shù)在執(zhí)行時遇到變量標(biāo)示符解析的時,首先從當(dāng)前作用域查找,找不到則一直沿著作用域鏈向上搜索。作用域鏈會形成一個非常有意思的特性,叫閉包。就是外層函數(shù)執(zhí)行完了(棧幀已經(jīng)彈出),如果內(nèi)層函數(shù)對象還沒被回收,外層作用域的變量環(huán)境會一直保留著,當(dāng)內(nèi)層函數(shù)執(zhí)行的時候,依然能訪問外層作用域的變量環(huán)境。

3、面向?qū)ο?/b>

javascript是一門非常面向?qū)ο蟮恼Z言,對象的創(chuàng)建和使用極其方便。面向?qū)ο蟮?個特性里面,封裝性的體現(xiàn)略差一點,由于javascript是動態(tài)語言,討論多態(tài)性意義也不是很大。個人認(rèn)為面向?qū)ο笾饕墙鉀Q了兩大問題,一是以一個符合現(xiàn)實世界觀的方式組織抽象的代碼,二是解決復(fù)用的問題。前者先不做多討論,那是一種思維方式和語言關(guān)系不大。后者在javascript里的實現(xiàn)是非常有意思的。

可以通過兩個方法來解釋對象的復(fù)用。假設(shè)有a、b兩個對象,b對象希望復(fù)用a對象的屬性和方法。一種做法是將a對象中所有的內(nèi)容拷貝到b對象,這是Object.assign方法的功能。這種做法雖然很樸實,但是在一些簡單的復(fù)用場景是非常有用的。改方法的問題是會造成數(shù)據(jù)的冗余,關(guān)系復(fù)雜的時候維護(hù)起來就很困難。另一種做法是在b對象中保留一個指向a對象的指針。當(dāng)我在訪問b對象的內(nèi)容時,如果當(dāng)前對象查不到,則沿著該指針繼續(xù)搜索下去。這是Object.create方法能達(dá)到如此效果。Object.create本質(zhì)是利用了javascript原型鏈的特性。如何構(gòu)造原型鏈?必須利用函數(shù)的另外一個角色——構(gòu)造器。當(dāng)把new 操作符用到函數(shù)之上時,函數(shù)就發(fā)揮著構(gòu)造器的角色。通過構(gòu)造器構(gòu)造對象時,其首先會創(chuàng)建一個空對象,然后將對象的原型指向構(gòu)造器的prototype屬性,以此就可以形成原型鏈了。javascript里本質(zhì)是沒有類的概念,Es6引入的class關(guān)鍵字只是個語法糖,本質(zhì)還是通過原型鏈實現(xiàn)繼承。

個人感覺javascript里的繼承更直接了當(dāng),直接從對象的角度去考慮復(fù)用,其實是更接近現(xiàn)實的世界觀。

4、事件循環(huán)

javascript還有個明顯的特點——單線程。javascript早期都是用作ui開發(fā),單線程可以比較好當(dāng)規(guī)避同步問題,降低了ui開發(fā)門檻。單線程需要解決的是效率問題,javascript里的解決思想是異步非阻塞。就是javascript主進(jìn)程不要做耗時的事情,保證能快速執(zhí)行快速相應(yīng),而將耗時的、io等待的事情交給其它進(jìn)程去做。

在實現(xiàn)上javascript利用了一個事件循環(huán)和任務(wù)隊列,事件循環(huán)會不斷的檢查任務(wù)隊列有沒有需要處理的任務(wù),有則馬上取出處理,無則等待。進(jìn)入一個調(diào)用棧時,對于io操作一般是要立即返回,而把后續(xù)要做的事情放到任務(wù)隊列里,這樣就不會造成io的阻塞。

正是單線程的特性,讓javascript在后端開發(fā)領(lǐng)域也火了一把。nodeJs讓javascript可以跑在服務(wù)端后,對并發(fā)的支持有自己獨特的優(yōu)勢。

5、后記

近些年javascript的應(yīng)用越來越廣泛,“任何能夠用JavaScript實現(xiàn)的應(yīng)用系統(tǒng),最終都必將用JavaScript實現(xiàn)”的預(yù)言好像正在一步步變成現(xiàn)實。個人覺得ES6、ES7、ES8將這門語言變復(fù)雜和臃腫了。ES3其實就將最重要的基石確定了。javascript有這么強(qiáng)大的生命力,個人覺得主要原因是其簡潔而強(qiáng)大,希望后面不要變得太臃腫。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88367.html

相關(guān)文章

  • 理解JavaScript核心識點:原型

    摘要:首先,需要來理清一些基礎(chǔ)的計算機(jī)編程概念編程哲學(xué)與設(shè)計模式計算機(jī)編程理念源自于對現(xiàn)實抽象的哲學(xué)思考,面向?qū)ο缶幊淌瞧湟环N思維方式,與它并駕齊驅(qū)的是另外兩種思路過程式和函數(shù)式編程。 JavaScript 中的原型機(jī)制一直以來都被眾多開發(fā)者(包括本人)低估甚至忽視了,這是因為絕大多數(shù)人沒有想要深刻理解這個機(jī)制的內(nèi)涵,以及越來越多的開發(fā)者缺乏計算機(jī)編程相關(guān)的基礎(chǔ)知識。對于這樣的開發(fā)者來說 J...

    iKcamp 評論0 收藏0
  • 33 個 js 核心概念(三):值類型與引用類型

    摘要:它們的區(qū)別之一就是在計算機(jī)中的存儲方式不同基本類型數(shù)據(jù)是將變量名及值存儲在變量對象中,而引用類型的數(shù)據(jù)是將變量名和地址存儲在變量對象中,真正的值是存儲在堆內(nèi)存中。 showImg(https://segmentfault.com/img/remote/1460000017151449); 說點別的 這是《關(guān)于 JavaScript 你必須要知道的 33 個概念 》系列的第三篇文章,今天...

    everfight 評論0 收藏0
  • 理解JavaScript核心識點:作用域

    摘要:也毫不例外,但在中作用域的特性與其他高級語言稍有不同,這是很多學(xué)習(xí)者久久難以理清的一個核心知識點。主要使用的是函數(shù)作用域。 關(guān)于作用域:About Scope 作用域是程序設(shè)計里的基礎(chǔ)特性,是作用域使得程序運行時可以使用變量存儲值、記錄和改變程序的狀態(tài)。JavaScript 也毫不例外,但在 JavaScript 中作用域的特性與其他高級語言稍有不同,這是很多學(xué)習(xí)者久久難以理清的一個核...

    HelKyle 評論0 收藏0
  • JS核心識點梳理——異步,單線程,運行機(jī)制

    摘要:引言學(xué)習(xí)的時候,經(jīng)常聽人說,即是異步的,又是單線程的。所以我們說是異步單線程的。參考從瀏覽器多進(jìn)程到單線程,運行機(jī)制最全面的一次梳理運行機(jī)制詳解再談異步機(jī)制詳解運行原理解析并發(fā)模型與事件循環(huán) showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 學(xué)習(xí)javascipt的時候,經(jīng)常聽人說,javascipt即是異步...

    TANKING 評論0 收藏0
  • 理解JavaScript核心識點:This

    摘要:關(guān)鍵字計算為當(dāng)前執(zhí)行上下文的屬性的值。毫無疑問它將指向了這個前置的對象。構(gòu)造函數(shù)也是同理。嚴(yán)格模式無論調(diào)用位置,只取顯式給定的上下文綁定的,通過方法傳入的第一參數(shù),否則是。其實并不屬于特殊規(guī)則,是由于各種事件監(jiān)聽定義方式本身造成的。 this 是 JavaScript 中非常重要且使用最廣的一個關(guān)鍵字,它的值指向了一個對象的引用。這個引用的結(jié)果非常容易引起開發(fā)者的誤判,所以必須對這個關(guān)...

    TerryCai 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<