Node.js的簡史

回顧Node.js從2009年到現在的歷史 你可能難以置信,但Node.js只有9歲。 相比之下,JavaScript已經有23歲了,而我們所熟悉的網路(在Mosaic問世之後)已經有25歲了。 對於一個技術而言,9年的歷史只是極短暫的時間,但Node.js似乎已經存在了很久很久。 我很榮幸從它剛出生的那天開始就與Node一起工作,儘管當時只有很少的資訊,但你已經能夠感覺到它是一個重大的事物。 在這篇文章中,我想從歷史的角度來概述Node的大局。 一點歷史 2009年 2010年 2011年 2012年 2013年 2014年 2015年 2016年 2017年 2018年 2019年 2020年 一點歷史 JavaScript是一種由Netscape創建的的網頁瀏覽器操控語言,用於操控瀏覽器內部的網頁,Netscape Navigator。 Netscape的業務模式之一是出售Web伺服器,其中包括一個名為Netscape LiveWire的環境,可以使用伺服器端的JavaScript創建動態網頁。因此,伺服器端JavaScript的概念並不是由Node.js引入的,但它的歷史和JavaScript一樣久遠,只是當時並不成功。 導致Node.js崛起的重要因素之一就是時機。幾年來,JavaScript被視為一種認真的語言,多虧了“Web 2.0”應用程序,這些應用程序向世界展示了現代化Web體驗的可能性(比如Google Maps或GMail)。 JavaScript引擎的性能水平大幅提高,多虧於瀏覽器競爭的戰鬥,這場戰鬥至今依然激烈進行中。每個主要瀏覽器背後的開發團隊每天都在努力提供更好的性能,這對於JavaScript作為一個平台來說是個巨大的勝利。Node.js在幕後使用的V8引擎就是其中之一,特別是Chrome的JS引擎。 但當然,Node.js不僅僅因為純粹的運氣或時機而受歡迎。它在JavaScript在服務器端的編程上引入了很多創新思維。 2009年 Node.js誕生 第一個形式的npm誕生 2010年 Express誕生 Socket.io誕生 2011年 npm達到1.0版本 大公司開始採用Node.js:LinkedIn, Uber Hapi誕生 2012年 采用速度非常快 2013年 第一個使用Node.js的大型網站平台:Ghost Koa誕生 2014年 大分叉:io.js是Node.js的一個重大分叉,旨在引入ES6支持並加快發展速度 2015年 Node.js基金會成立 io.js合併回Node.js npm引入私有模組 Node 4(此前曾沒有1、2、3版本的發布) 2016年 leftpad事件 Yarn誕生 Node 6 2017年 npm更加關注安全性 Node 8 - 9 HTTP/2 V8將Node納入測試套件,正式將Node作為JS引擎的目標之一,除Chrome外還有許多JS引擎 每週下載30億個npm套件 2018年 Node 10 - 11 ES模塊 ....

Node緩衝區

瞭解Node緩衝區是什麼,它們用於什麼,以及如何使用它們。 緩衝區是什麼? 緩衝區是一塊內存區域。與C、C++或Go等使用系統編程語言的開發人員(或任何與內存交互的程序員)相比,JavaScript開發人員對這個概念不太熟悉,因為js開發人員並不需要直接與內存交互。 它代表著在V8 JavaScript引擎之外分配的固定大小的內存塊(無法調整大小)。 您可以將緩衝區視為一個整數數組,其中每個整數表示一個字節的數據。 它是由Node的Buffer類實現的。 為什麼我們需要緩衝區? 引入緩衝區是為了幫助開發人員處理二進制數據,在傳統上,js只處理字符串而不是二進制數據。 緩衝區與流(streams)緊密相關。當流處理器接收到的數據速度比它處理的速度快時,它將數據放入緩衝區。 對於緩衝區的一個簡單的可視化是當您觀看YouTube視頻時,紅色條超出了您的視覺點:您正在比您查看數據更快地下載數據,並且您的瀏覽器將其緩衝。 如何創建一個緩衝區 使用Buffer.from(),Buffer.alloc()和Buffer.allocUnsafe()方法來創建緩衝區。 const buf = Buffer.from('Hey!') Buffer.from(array) Buffer.from(arrayBuffer[, byteOffset[, length]]) Buffer.from(buffer) Buffer.from(string[, encoding]) 您還可以通過傳遞大小來初始化緩衝區。這將創建一個1KB大小的緩衝區。 const buf = Buffer.alloc(1024) //或者 const buf = Buffer.allocUnsafe(1024) 使用緩衝區 訪問緩衝區的內容 緩衝區作為字節數組,可以像訪問數組一樣訪問。 const buf = Buffer.from('Hey!') console.log(buf[0]) //72 console.log(buf[1]) //101 console.log(buf[2]) //121 這些數字是緩衝區位置中標識字符的Unicode編碼(H => 72,e => 101,y => 121)。 您可以使用toString()方法打印緩衝區的全部內容。 console.log(buf.toString()) 请注意,如果您使用設置大小的數字初始化緩衝區,您將獲得預初始化內存的訪問權限,其中包含隨機數據,而不是一個空的緩衝區。 獲取緩衝區的長度 使用length屬性。 const buf = Buffer.from('Hey!') console.log(buf.length) 遍歷緩衝區的內容 const buf = Buffer.from('Hey!') for (const item of buf) { console....

Number isNaN() 方法

瞭解 JavaScript Number 物件的 isNaN() 方法 NaN 是一個特殊的情況。一個數字只有在它本身是 NaN 或者是 0 除以 0 的結果時才是 NaN。 在其他所有情況下,我們可以傳入任何值,但它將返回 false: Number.isNaN(NaN) //true Number.isNaN(0 / 0) //true Number.isNaN(1) //false Number.isNaN('Flavio') //false Number.isNaN(true) //false Number.isNaN({}) //false Number.isNaN([1, 2, 3]) //false

Number 的 isSafeInteger() 方法

了解 JavaScript Number 物件的 isSafeInteger() 方法 如果數字超過安全整數的範圍,則可能滿足 Number.isInteger(),但不滿足 Number.isSafeInteger(),這已在上面解釋過。 因此,大於 2^53 和小於 -2^53 的數字是不安全的: Number.isSafeInteger(Math.pow(2, 53)) // false Number.isSafeInteger(Math.pow(2, 53) - 1) // true Number.isSafeInteger(Math.pow(2, 53) + 1) // false Number.isSafeInteger(-Math.pow(2, 53)) // false Number.isSafeInteger(-Math.pow(2, 53) - 1) // false Number.isSafeInteger(-Math.pow(2, 53) + 1) // true

Number 的 toFixed() 方法

了解 JavaScript 中 Number 的 toFixed() 方法的全部內容。 你可以使用這個方法來取得表示數字的定點表示法的字串: new Number(21.2).toFixed() //21 你可以加入一個可選的數字參數設定位數: new Number(21.2).toFixed(0) //21 new Number(21.2).toFixed(1) //21.2 new Number(21.2).toFixed(2) //21.20

Number.isFinite() 方法

在 JavaScript 的 Number 物件中,可以使用 isFinite() 方法來檢測傳入的值是否為有限數字。若不是有限數字,則會返回 false,包括布林值、字串、物件、陣列等等其他類型: Number.isFinite(1) // true Number.isFinite(-237) // true Number.isFinite(0) // true Number.isFinite(0.2) // true Number.isFinite('Flavio') // false Number.isFinite(true) // false Number.isFinite({}) // false Number.isFinite([1, 2, 3]) // false

Number的valueOf()方法

了解JavaScript中Number的valueOf()方法 該方法返回Number對象的數值: const age = new Number(36) typeof age //object age.valueOf() //36

Object create() 方法

了解 JavaScript Object 原型上 create() 方法的相關資訊。 在 ES5 中引入。 用於創建一個新的對象,並指定其原型。 使用方法: const newObject = Object.create(prototype) 範例: const animal = {} const dog = Object.create(animal) 新創建的對象將繼承所有原型對象的屬性。 您可以指定第二個參數以添加原型缺失的新屬性給對象: const newObject = Object.create(prototype, newProperties) 其中 newProperties 是一個對象,其中定義了每個屬性。 範例: const animal = {} const dog = Object.create(animal, { breed: { value: 'Siberian Husky' } }); console.log(dog.breed) //'Siberian Husky' 我並沒有只寫 breed: 'Siberian Husky',而是必須傳遞一個屬性描述對象,定義在本頁開頭。 Object.create() 經常與 Object.assign() 結合使用: const dog = Object.assign(Object.create(animal), { bark() { console.log('bark') } })

Object defineProperty() 方法

了解 JavaScript Object 物件的 defineProperty() 方法的所有相關資訊 創建或配置物件屬性。 返回該物件。 接受 3 個參數。第一個是我們將要在其上創建或配置屬性的物件。第二個是以字串形式定義的屬性名稱。第三個是具有屬性定義的物件。 範例: const dog = {} Object.defineProperty(dog, 'breed', { value: 'Siberian Husky' }) console.log(dog.breed) //'Siberian Husky' 我不只是寫了 breed: 'Siberian Husky',而是需要傳遞一個屬性描述符物件,該物件在本頁的開頭被定義。

Object getOwnPropertyDescriptors()方法

了解JavaScript Object对象的getOwnPropertyDescriptors()方法 此方法返回对象的所有自有(非继承)属性描述符。 Object.getOwnPropertyDescriptors(obj)接受一个对象,并返回一个提供属性描述符列表的新对象。 示例: const dog = {} Object.defineProperties(dog, { breed: { value: 'Siberian Husky' } }) Object.getOwnPropertyDescriptors(dog) /\* { breed: { value: 'Siberian Husky', writable: false, enumerable: false, configurable: false } } \*/ 有一个使用场景可以非常有用。ES2015给我们提供了Object.assign(),它可以复制一个或多个对象的所有可枚举自有属性,并返回一个新对象。但是它存在一个问题,就是它无法正确复制具有非默认属性的属性。 例如,如果一个对象只有一个setter,使用Object.assign()无法正确复制到新对象中。例如: const person1 = { set name(newName) { console.log(newName) } } 这个复制尝试将不起作用: const person2 = {} Object.assign(person2, person1) 但这个可以正常工作,并正确复制setter: const person3 = {} Object.defineProperties(person3, Object.getOwnPropertyDescriptors(person1)) 可以通过控制台测试看到: person1.name = 'x' "x" person2.name = 'x' person3.name = 'x' "x" person2不包含setter,它没有被复制过来。...