国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

理解javascript核心知識點

laznrbfe / 3164人閱讀

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

0、前言

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

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

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

1、數據類型

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

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

undefined:
這是一種非常特殊的數據類型,表示未賦值。變量或屬性定義后未賦值就為undefined。這種數據類型用處不多,一般只是拿來區分有無賦值。

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

function
函數雖然被當做一種數據類型,但其本質還是一種特殊的對象,是從Object繼承而來的。

2、函數及其運行時

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

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

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

3、面向對象

javascript是一門非常面向對象的語言,對象的創建和使用極其方便。面向對象的4個特性里面,封裝性的體現略差一點,由于javascript是動態語言,討論多態性意義也不是很大。個人認為面向對象主要是解決了兩大問題,一是以一個符合現實世界觀的方式組織抽象的代碼,二是解決復用的問題。前者先不做多討論,那是一種思維方式和語言關系不大。后者在javascript里的實現是非常有意思的。

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

個人感覺javascript里的繼承更直接了當,直接從對象的角度去考慮復用,其實是更接近現實的世界觀。

4、事件循環

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

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

正是單線程的特性,讓javascript在后端開發領域也火了一把。nodeJs讓javascript可以跑在服務端后,對并發的支持有自己獨特的優勢。

5、后記

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88367.html

相關文章

  • 理解JavaScript核心識點:原型

    摘要:首先,需要來理清一些基礎的計算機編程概念編程哲學與設計模式計算機編程理念源自于對現實抽象的哲學思考,面向對象編程是其一種思維方式,與它并駕齊驅的是另外兩種思路過程式和函數式編程。 JavaScript 中的原型機制一直以來都被眾多開發者(包括本人)低估甚至忽視了,這是因為絕大多數人沒有想要深刻理解這個機制的內涵,以及越來越多的開發者缺乏計算機編程相關的基礎知識。對于這樣的開發者來說 J...

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

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

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

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

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

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

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

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

    TerryCai 評論0 收藏0

發表評論

0條評論

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