Node.js新手必須知道的4個JavaScript概念

2022-01-29 藍橋雲課精選

如果只需要知道一種程式語言就可以構建一個全棧的應用程式,是不是特別了不起?Ryan Dahl為了把這個想法成為現實,創造了node.js。Node.js是建立在Chrome強勁的V8 JavaScript引擎上的伺服器端框架。雖然最初是用C++編寫的,但是應用程式通過JavaScript運行。

這樣一來,問題就解決了。一種語言就可以統治一切。而且,在整個應用程式中你只需要使用這一種語言。所以,我們需要深刻了解node.js。這就是本文的主題。

下面這四個基本概念是你想要掌握node.js所必需的。我會儘可能長話短說向大家介紹它們。

由於Node.js是一種伺服器端框架,所以它的一個主要工作就是處理瀏覽器請求。在傳統的I/O系統中,當前請求只有當先前請求的響應(HTML頁面)已到達才會發出。這就是為什麼它被稱為阻塞I/O。伺服器阻塞其他請求是為了處理當前的請求,而這會導致瀏覽器的等待。

Node.js不遵循I/O的這個原則。如果一個請求需要花費較長時間,那麼Node.js會發送請求到事件循環(event loop)中,並繼續在調用棧(call stack)中處理下一個請求。一旦未決請求完成處理,它就會告訴Node.js,並將響應渲染在瀏覽器上。

用一個虛擬的例子來理解這一點:

阻塞I / O

// take order for table 1 and wait...var order1 = orderBlocking(['Coke', 'Iced Tea']);// once order is ready, take order back to table.serveOrder(order1);// once order is delivered, move on to another table.// take order for table 2 and wait...var order2 = orderBlocking(['Coke', 'Water']);// once order is ready, take order back to table.serveOrder(order2);// once order is delivered, move on to another table.// take order for table 3 and wait...var order3 = orderBlocking(['Iced Tea', 'Water']);// once order is ready, take order back to table.serveOrder(order3);// once order is delivered, move on to another table.

在這個餐廳例子中,服務員給出菜單,等待訂單完成,然後再回到餐桌根據菜單上菜。在當前客戶點菜時,服務員就在旁邊等待,不接受其他客戶的菜單。

非阻塞I / O

// take order for table 1 and move on...orderNonBlocking(['Coke', 'Iced Tea'], function(drinks){ return serveOrder(drinks);});// take order for table 2 and move on...orderNonBlocking(['Beer', 'Whiskey'], function(drinks){ return serveOrder(drinks);});// take order for table 3 and move on...orderNonBlocking(['Hamburger', 'Pizza'], function(food){ return serveOrder(food);});

在這個例子中,服務員獲得菜單,並告知廚師,然後返回取另一份菜單。在完成第一個菜單進程中,他既按照順序給當前顧客上菜,也接受來自其他客戶的點單。服務員不會因為阻塞來自於其他客戶的點菜而浪費時間。


原型是JavaScript的一個複雜概念。不過因為在Node.js中你要多次用到原型,所以每個JavaScript開發人員都必須了解這個概念。

在實現經典繼承的語言中,例如Java,或C ++,對於以代碼重用為目的的語言,你首先必須寫一個類,然後從該類創建對象或擴展該類。但是,在JavaScript中不存在類的概念。首先在JavaScript中創建一個對象,然後從這個對象中增加自己的對象,或創建新的對象。這就是所謂的原型傳承和通過原型的實現。

每個JavaScript對象被連結到一個來自於它可以繼承屬性的原型對象。原型類似其他OO語言中的類,但不同的是,它們本身也是對象。每一個對象都連結到Object.prototype,而Object.prototype自帶JavaScript預定義。

如果你通過obj.propName或 obj['propName'] 查找屬性,而對象並不具有可通過 obj.hasOwnProperty(『propName』)被檢查的屬性,那麼JavaScript的運行時會在其原型對象中查找屬性。如果原型對象也沒有這樣的屬性,那麼依次檢查它的原型,直到找到匹配,或者到達Object.prototype。如果該屬性不存在原型鏈,那麼它會導致一個未定義的值。

通過下面的示例代碼來理解這個概念:

if (typeof Object.create !== 'function') { Object.create = function (o) { var F = function () {}; F.prototype = o; return new F(); };var otherPerson = Object.create(person);

當你創建一個新對象的時候,你必須選擇一個應該是它的原型的對象。這裡,我們添加了一個方法到Object function。該方法創建了一個使用另一個對象作為其原型的新對象,而原型作為參數傳遞給它。

當我們改變新對象的時候,它的原型不受影響。但是,當我們進行改變原型對象的時候,這些變化在所有基於該原型的對象上可見。

原型是一個複雜的概念。我將在另一篇文章中詳細說明。


如果你曾經接觸過Java中的包,那麼Node.js中的模塊也沒有什麼不同。如果沒有,那麼也不用擔心。模塊是包含特定目的代碼的簡單的JavaScript文件。模塊模式用來使你的代碼易於導航和使用。要使用模塊屬性,你需要在JavaScript文件中需求它,很像在Java類中導入包。

node.js中有兩種類型的模塊。

核心模塊——這些模塊是用Node.js庫預編譯過的。核心模塊的目的是提供開發者經常發生和重複的代碼段,這些代碼段如果不可用的話,會導致開發者陷入不得不一次又一次地寫相同代碼的處境。一些常見的核心模塊是HTTP,URL,EVENTS,FILE SYSTEM,等等。

用戶定義模塊——用戶定義模塊是開發人員在應用程式內創建用於特定目的的模塊。當核心模塊不能滿足期望功能的時候就需要用戶定義模塊。

模塊通過require函數提取。如果它是一個核心模塊,那麼參數僅僅是模塊的名稱。如果它是一個用戶自定義模塊,那麼參數就是該模塊在文件系統中的路徑。例如:

// extract a core module like thisvar http = require('http);// extract a user defined module like thisvar something = require('./folder1/folder2/folder3/something.js');


在JavaScript中,函數被認為是第一類對象。這意味著你可以對這些函數做所有可對常規對象做的操作。你可以賦值函數給變量,作為參數傳遞函數給方法,作為對象屬性聲明函數,甚至從函數返回函數。

回調函數是JavaScript中的匿名函數,它可以作為參數傳遞給其他函數,要麼被執行或返回自函數稍後執行。這是回調函數——這個使用最廣的函數編程範式的基礎。

當我們將回調函數作為參數傳遞給另一個函數的時候,我們只能傳遞函數定義……換言之就是,我們不知道這個回調函數什麼時候會執行。這完全取決於調用函數的機制。它會在以後的某個時間點「回調」,因此而得名。這也是非阻塞或Node.js異步行為的唯一基礎,如下例所示。

setTimeout(function() { console.log("world");}, 2000)console.log("hello");

這是回調函數最簡單的例子之一。我們將一個匿名函數作為一個參數傳遞,這個參數只需在控制臺上記錄一些輸出到setTimeout函數。它是唯一的函數定義,但是不知道何時執行。這需要經過2秒後,通過第二個參數,調用setTimeout函數來決定。

首先,第二個日誌語句記錄輸出到控制臺,然後,2秒鐘後,回調函數中的日誌語句記錄輸出。

// outputhelloworld

上面這些就是Node.js新手必須知道的4個最重要的 JavaScript概念。你的看法呢?希望大家能夠暢所欲言!

譯文連結:http://www.codeceo.com/article/nodejs-4-javascript-concepts.html
英文原文:Top 4 JavaScript Concepts a Node.js Beginner Must Know
翻譯作者:碼農網 – 小峰


相關焦點

  • centos7編程實踐:安裝nodejs
    Node.js是一個javascript運行環境。它讓javascript可以開發後端程序,實現幾乎其他後端語言實現的所有功能,可以與PHP、Java、Python、.NET、Ruby等後端語言平起平坐。
  • Node.js開發者必須了解的4個JS要點
    當第一桌飯菜處理完畢時,他會為那桌客人上菜,然後繼續接收其它客人的指令。這樣一來服務員不會由於阻塞指令而造成時間浪費。2. 原型(Prototype)原型在JS中是一個複雜的概念。在典型繼承機制語言如Java或C++中,為了實現代碼復用,你必須先創建一個類然後透過它來生成對象或透過類擴展來生成對象。但是在JS中沒有類似的類概念。
  • JavaScript 和 Node.js 簡史,前端未來走向何方?
    發布 3 個月後,它被 重命名為「JavaScript」,為的是蹭在高級程式設計師中流行的 Java 語言(和 JS 完全不同,毫無關係的語言)的熱度。在此期間,(失敗的)ES-4 提案(由 Mozilla 等組織主導)曾試圖推廣一些更傳統的編程概念,如類、模塊等。因為有人擔憂 ES4 會「破壞 Web」,以及允許 客戶端動態內容 的 AJAX(異步 JavaScript 和 XML)的誕生,這個標準被放棄了。
  • 前端頁面開發之Node JS初學者指南
    2009年5月,Ryan Dahl在GitHub上發布了最初版本的部分Node.js包,隨後幾個月裡,有人開始使用Node.js開發應用。  2009年11月和2010年4月,兩屆JSConf大會都安排了Node.js的講座。
  • 什麼是伺服器端JavaScript Node.js?
    關注+轉發+收藏+私信「資料」=百G精品學習資料可靠的應用開發,如聊天和進度管理Node.js的。毫無疑問,它是一個熱門工具,因為它已經跳出了網絡世界,現在在物聯網領域使用Node.js。目錄應用開發人員必須看到嗎?
  • Node.js模塊化你所需要知道的事
    前言我們知道,Node.js是基於CommonJS規範進行模塊化管理的,模塊化是面對複雜的業務場景不可或缺的工具,或許你經常使用它,但卻從沒有系統的了解過,所以今天我們來聊一聊Node.js模塊化你所需要知道的一些事兒,一探Node.js模塊化的面貌。
  • Node.js 4.0.0 正式發布了
    不用驚訝,就是4.0.0,這是 Node.js 項目 和 io.js 項目複合後的首個穩定版本。目前 Node 團隊包含 44 個成員,還有超過 100 名的代碼貢獻者。Node.js 4.0 包含 V8 4.5,支持大多數 ES6 的新特性。同時 Node 4.0 將引入 LTS 長期支持計劃的發行周期,首個LTS版本將於10月份發布,同時 Node 以後將每 6 個月發布一個主要的穩定版本,4月份一個,10月份一個(類似 Ubuntu)。
  • 你必須要知道的JavaScript數據結構與面試題解答
    今天,我們將帶你了解JS開發人員都需要知道的7個JavaScript數據結構。高層數據結構是用於存儲和組織數據的技術,這些數據使修改,導航和訪問變得更加容易。數據結構決定了如何收集數據,我們可以用來訪問數據的功能以及數據之間的關係。數據結構幾乎用於計算機科學和編程的所有領域,從作業系統到基本的編碼再到人工智慧。
  • 2021 年最值得了解的 Node.js 工具(下)
    3.2 應用場景2: 基於Node的緩存工具有哪些?node-cache :Node.js內存緩存模塊。node-cache-manager :Node.js Cache模塊。4.最小化 💧❝應用的性能優化,我們會想到js、html、css的文件的壓縮,使得其文件最小化,那麼有什麼輪子可以直接使用?❞4.1 應用場景1: js的文件壓縮工具有哪些?
  • 10 個最適合 Web 和 APP 開發的 NodeJS 框架
    Node.js Express 對於一個已經在使用 node.js 的開發人員來說,Express 或者」node.js express」並不是一個新鮮事。Express 框架提供了對 node.js 原生 API 的比較好的封裝,從而使開發者更加容易地使用node.js。 Express 框架提供了用來開發強壯的 web/移動應用,以及 API 的所有功能。
  • Node.JS快速入門
    >在命令提示符下輸入命令node -v會顯示當前node的版本號2.快速入門2.1 控制臺輸出我們現在做個最簡單的小例子,演示如何在控制臺輸出,在e盤創建文件夾nodedemo ,創建文本文件demo1.js,代碼內容我們在命令提示符下輸入命令node demo1.js ,結果如下:2.2 使用函數我們剛才的例子非常簡單,咱們這裡再看一下函數的使用:我們在命令提示符下輸入命令
  • Node.js 入門你需要知道的 10 個問題
    本文為您分享「Node.js 入門你需要知道的 10 個問題」這些問題可能也是面試中會被問到的,當然問題不僅僅是這 10 道,因此,最近開源了一個新項目 https://github.com/Q-Angelo/Nodejs-Interview-Questions
  • Node.js 學習資料和教程(值得收藏)
    >被誤解的 Node.jsNode.js C++ addon編寫實戰系列熱門node.js模塊排行榜,方便找出你想要的模塊nodejs多線程,真正的非阻塞淺析nodejs>一個周末掌握IT前沿技術之node.js篇用node+express搭建多人博客教程系列Node.js靜態文件伺服器實戰人人和微博登錄模塊的實現《京JS》會議 & V8上的
  • JavaScript 執行機制
    不論你是javascript新手還是老鳥,不論是面試求職,還是日常開發工作,我們經常會遇到這樣的情況:給定的幾行代碼,我們需要知道其輸出內容和順序
  • 【 Node.js】你應該知道的 NPM 知識都在這!
    為什麼寫這篇文章很多 Node.js 開發者,都知道有 package.json 這個文件,也多少都了解一些 npm 知識,但是可能沒有系統的學習過,這部分的知識對於開發一個  cli 工具,發布自己的 npm 包都很常用,開發中也會經常用到npm script內容,系統的學習一下確實會有所幫助,上面三個場景如果你都用不到,配置上節約時間,
  • TKoa 1.0.1 發布,TypeScript 版的 Node.js Koa 框架
    更新信息: npm增加編譯好的 javascript 文件T-Koa 介紹
  • Node.js原型鏈汙染的利用
    這裡以Code-Breaking 2018的Thejs這一題為例。下載node.js:這個就不多解釋了直接去官網下載並安裝就可以了。安裝完後可以看到他提示我們發現了4個漏洞,可以運行npm audit fix進行修復,或運行npm audit獲取詳細信息。這裡我們就運行npm audit看一下詳細信息:
  • 【 Node.js 進階】你應該知道的 NPM 知識都在這!
    為什麼寫這篇文章很多 Node.js 開發者,都知道有 package.json 這個文件,也多少都了解一些 npm 知識,但是可能沒有系統的學習過,這部分的知識對於開發一個  cli 工具,發布自己的 npm 包都很常用,開發中也會經常用到npm script內容,系統的學習一下確實會有所幫助,上面三個場景如果你都用不到,配置上節約時間,
  • 你不知道的 Npm(Node.js 進階必備好文)
    為什麼寫這篇文章很多 Node.js 開發者,都知道有 package.json 這個文件,也多少都了解一些 npm 知識,但是可能沒有系統的學習過,這部分的知識對於開發一個  cli 工具,發布自己的 npm 包都很常用,開發中也會經常用到npm script內容,系統的學習一下確實會有所幫助,上面三個場景如果你都用不到,配置上節約時間,
  • 這一次,徹底弄懂 JavaScript 執行機制
    不論你是javascript新手還是老鳥,不論是面試求職,還是日常開發工作,我們經常會遇到這樣的情況:給定的幾行代碼,我們需要知道其輸出內容和順序。因為javascript是一門單線程語言,所以我們可以得出結論:javascript是按照語句出現的順序執行的看到這裡讀者要打人了:我難道不知道js是一行一行執行的?還用你說?