1. Node.js 使用了單 線程、非阻塞的事件編程模式數據庫
Node.js 最大的特色就是採用異步式 I/O 與事件驅動的架構設計。對於高併發的解決方 案,傳統的架構是多線程模型,也就是爲每一個業務邏輯提供一個系統線程,經過系統線程切 換來彌補同步式 I/O 調用時的時間開銷。Node.js 使用的是單線程模型,對於全部 I/O 都採用 異步式的請求方式,避免了頻繁的上下文切換。Node.js 在執行的過程當中會維護一個事件隊 列,程序在執行時進入事件循環等待下一個事件到來,每一個異步式 I/O 請求完成後會被推送 到事件隊列,等待程序進程進行處理。npm
Node.js 的異步機制是基於事件的,全部的磁盤 I/O、網絡通訊、數據庫查詢都以非阻塞的方式請求,返回的結果由事件循環來處理。編程
異步式 I/O (Asynchronous I/O)或非阻塞式 I/O (Non-blocking I/O)則針對 全部 I/O 操做不採用阻塞的策略。當線程遇到 I/O 操做時,不會以阻塞的方式等待 I/O 操做 的完成或數據的返回,而只是將 I/O 請求發送給操做系統,繼續執行下一條語句。當操做 系統完成 I/O 操做時,以事件的形式通知執行 I/O 操做的線程,線程會在特定時候處理這個 事件。爲了處理異步 I/O,線程必須有事件循環,不斷地檢查有沒有未處理的事件,依次予以處理。windows
2. Node.js 的事件循環機制
Node.js 在何時會進入事件循環呢?答案是 Node.js 程序由事件循環開始,到事件循環結束,全部的邏輯都是事件的回調函數,因此 Node.js 始終在事件循環中,程序入口就是 事件循環第一個事件的回調函數。事件的回調函數在執行的過程當中,可能會發出 I/O 請求或 直接發射(emit)事件,執行完畢後再返回事件循環,事件循環會檢查事件隊列中有沒有未 處理的事件,直到程序結束。圖3-5說明了事件循環的原理。 數組
3. 當咱們要把某個包做爲工程運行時的一部分時,經過本地模式獲取,若是要在命令行下使用,則使用全局模式安裝 網絡
建立全局連接:在工程目錄下npm link [module],能夠把全局包當本地包使用,不支持windows.多線程
4. 全局對象:閉包
在 Node.js 中可以直接訪問到對象一般都是 global 的屬性,如 console、process 等,當你定義一個全局變量時,這個變量同時也會成爲全局對象的屬性。架構
5.視圖助手併發
Express 提供了一種叫作視圖助手的工具,它的功能是容許在視圖中訪問一個全局的函數或對象,不用每次調用視圖解析的時候單獨傳入。功能的解耦,減小代碼的冗餘。
6.JavaScript 高級特性
(1)變量的做用域爲函數,而不是{ }封閉代碼塊,會先搜索當前函數做用域,或者稱爲「局部做用域」,若是沒有找到則搜索其上層做用域,一直到全局做用域。做用域的嵌套關係不是在調用時肯定的,而是在定義時肯定的。
(2)在任何地方隱式定義的變量都會定義在全局做用域中,即不經過 var 聲明直接賦值的變量。這一點常常被人遺忘,而模塊化編程的一個重要原則就是避免使用全局變量,因此咱們在任何地方都不該該隱式定義變量。
7. 閉包
當一個函數返回它內部定義的一個函數時,就產生了一個閉包, 閉包不但包括被返回的函數,還包括這個函數的定義環境。函數的內部變量也返回了,並在內存中生成了一個副本。
做用:一是實現嵌套的回調函數,二是隱藏對象的細節(private)
8. 對象
(1)JavaScript 只有對象,對象就是對象,不是類的實例。JavaScript中的對象是基於原型的。其對象實際上就是一個由屬性組成的關聯數組,屬性由名稱和值組成,值的類型能夠是任何數據類型,或者函數和其餘對象。
(2)其中,用句點運算符和關聯數組引用是等價的。使用初始化器定義對象,對象屬性名稱是否加引號是可選的,除非屬性名稱中有空格或者其餘可能形成歧義的字符,不然沒有必要使用引號。
(3)提供構造函數,用new來新建對象。
(4)對象函數中的this 指針不屬於某個函數,而是函數調用時所屬的對象。
(5)call和apply:做用是容許一個對象去調用另外一個對象的成員函數。call能夠用於實現對象的繼承。call 和 apply 的功能是一致的,二者細微的差異在於 call 以參數表來接受被調用函數的參數,而 apply 以數組來接受被調用函數的參數。
(6)bind的實現經過this指針。
9.原型
什麼時候使用原型,構造函數內定義來建立屬性呢?
(1)除非必須用構造函數閉包,不然儘可能用原型定義成員函數,由於這樣能夠減小開銷。
(2)儘可能在構造函數內定義通常成員,尤爲是對象或數組,由於用原型定義的成員是多個實例共享的。
10.原型鏈
JavaScript 中的對象分爲三類,一類是用戶建立的對象,一類是構造函數對象,一類是原型對象。
用戶建立的對象,即通常意義上用 new 語句顯式構造的對象。構造函數對象指的是普通的構造函數,即經過 new 調用生成普通對象的函數。原型對象特指構造函數 prototype 屬性指向的對象。這三類對象中每一類都有一個 __proto__ 屬 性,它指向該對象的原型,從任何對象沿着它開始遍歷均可以追溯到 Object.prototype。 構造函數對象有 prototype 屬性,指向一個原型對象,經過該構造函數建立對象時,被建立對象的 __proto__ 屬性將會指向構造函數的 prototype 屬性。原型對象有 constructor 屬性,指向它對應的構造函數。
11.淺拷貝與深拷貝
對象淺拷貝(shallow copy),即只複製基本類型的屬性,而共享對象類型的屬性。淺拷貝的問題是兩個對象共享對象類型的屬性,例如上例中 likes 屬性指向的是同一個數組。
實現一個徹底的複製,或深拷貝(deep copy),除了基本數據類型,還有多種不一樣的對象,對象內部還有複雜的結構,所以須要用遞歸的方式來實現。
12命名函數
儘可能給構造函數和回調函數命名,這樣當你在調試的時候能夠看見更清晰的調用棧