官方文件中對Node.js的描述為:
Node.js 是一個基於 Chrome V8 引擎的 JavaScript 執行環境。 Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。
1、Node.js是一個讓JavaScript執行在伺服器端的開發平臺。Node.js不是一種獨立的語言,Node.js使用JavaScript語言進行開發,執行在伺服器端的V8引擎上。Node.js沒有Web容器,它開發的網站可以不部署在任何HTTP伺服器上。
例知
http
var http = require('http') //引入http模組
http
.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'})
res.write('Hello Nodejs')
res.end()
}) //啟動伺服器
.listen(2019) //監聽埠
複製程式碼
在瀏覽器開啟網址:localhost:2019,頁面列印出Hello Nodejs
小應用:程式碼
爬取頁面HTML原始碼
爬取頁面內資料
站內評論
事件監聽
var EventEmitter = require('events').EventEmitter
// 生成一個EventEmitter例項
var life = new EventEmitter()
// 設定監聽事件數量增大,<=11
life.setMaxListeners(11)
// 監聽函式
// 具名函式,可清楚
function water(who) {
console.log('給 ' + who + ' 倒水')
}
life.on('touch', water) //addEventListener
life.on('touch', function(who) {
console.log('給 ' + who + ' 按摩')
})
life.on('touch', function(who) {
console.log('給 ' + who + ' 做飯')
})
life.on('touch', function(who) {
console.log('給 ' + who + ' 洗衣服')
})
life.on('touch', function(who) {
console.log('給 ' + who + ' 掃地')
})
life.on('touch', function(who) {
console.log('給 ' + who + ' 。。。6')
})
life.on('touch', function(who) {
console.log('給 ' + who + ' .。。7')
})
life.on('touch', function(who) {
console.log('給 ' + who + ' .。。8')
})
life.on('touch', function(who) {
console.log('給 ' + who + ' .。。9')
})
life.on('touch', function(who) {
console.log('給 ' + who + ' .。。10')
})
life.on('touch', function(who) {
console.log('我還能再做一件事哦')
})
life.on('nani', function(who) {
console.log('給 ' + who + ' 買衣服')
})
life.on('nani', function(who) {
console.log('給 ' + who + ' 交工資')
})
// // 清除單個事件
// life.removeListener('touch', water)
// // 清除所有的指定事件
// life.removeAllListeners('touch')
// // 清除所有的事件
// life.removeAllListeners()
var a = life.emit('touch', '寶寶我')
var b = life.emit('nani', '老孃我')
var c = life.emit('haha', '老孃和寶寶')
// 檢視被監聽的事件數量
console.log(life.listeners('touch').length)
console.log(EventEmitter.listenerCount(life, 'touch'))
console.log(EventEmitter.listenerCount(life, 'nani'))
// 判斷事件是否被監聽
console.log(a) //true
console.log(b) //true
console.log(c) //false
複製程式碼
輸出為:
給 寶寶我 倒水
給 寶寶我 按摩
給 寶寶我 做飯
給 寶寶我 洗衣服
給 寶寶我 掃地
給 寶寶我 。。。6
給 寶寶我 .。。7
給 寶寶我 .。。8
給 寶寶我 .。。9
給 寶寶我 .。。10
我還能再做一件事哦
給 老孃我 買衣服
給 老孃我 交工資
11
11
2
true
true
false
複製程式碼
上下文
this
// var pet = {
// words: '...',
// speak: function() {
// console.log(this.words)
// console.log(this === pet)
// }
// }
// pet.speak() //作為物件的方法呼叫,this指向呼叫這個函式的物件
/*-----------------------------------------------------------*/
// function pet(words) {
// this.words = words
// console.log(this.words)
// console.log(this === global)
// }
// pet('...') //函式的呼叫,this指向全域性變數
/*-----------------------------------------------------------*/
function Pet(words) {
this.words = words
this.speak = function() {
console.log(this.words)
console.log(this)
}
}
var cat = new Pet('Miao')
cat.speak() //建構函式的呼叫,this指向例項物件(新構建好的物件)
複製程式碼
輸出為:
... true
... true
Miao Pet { words: 'Miao', speak: [Function] }
call和apply
使用call和apply可以改變上下文執行物件,可以在自定義上下文中執行函式,兩者作用相同,僅僅是方法的第二個引數不同,call直接使用引數列表,apply使用引數陣列(可以直接用JavaScript本身有的arguments陣列或者封裝成陣列[引數1,引數2,…])。具體作用是呼叫一個物件的方法,以另一個物件替換當前物件,實際上是改變this指向的物件內容。
function Pet(words) {
this.words = words
this.speak = function() {
console.log(this.words)
}
}
function Dog(words) {
//使用call繼承,引數直接傳遞
Pet.call(this, words) //通過call繼承
//使用apply繼承,引數作為一個陣列傳遞
// Pet.apply(this, arguments)
}
var dog = new Dog('Wang')
dog.speak()
複製程式碼
輸出為:Wang
回撥函式
function learn(something) {
console.log(something)
}
// 具名函式呼叫
function we(callback, something) {
something += ' is cool'
callback(something)
}
we(learn, 'Nodejs')
// 匿名函式呼叫
we(function(something) {
console.log(something)
}, 'Jack')
複製程式碼
輸出為:
Nodejs is cool
Jack is cool
同步/非同步
var c = 0
function printIt() {
console.log(c)
}
//同步
// function plus() {
// // 設定延時
// setTimeout(function() {
// c += 1
// }, 1000)
// }
// plus()
// printIt()
//非同步
function plus(callback) {
setTimeout(function() {
c += 1
callback()
}, 1000)
}
plus(printIt)
複製程式碼
同步:輸出0,1秒後結束
非同步:1秒後輸出1,結束
Promise
Promise最大的好處是在非同步執行的流程中,把執行程式碼和處理結果的程式碼清晰地分離
Promise可以序列執行若干非同步任務
Promise可以並行執行非同步任務
Buffer
Buffer
類的例項類似於整數陣列,但 Buffer
的大小是固定的、且在 V8 堆外分配實體記憶體。 Buffer
的大小在建立時確定,且無法改變。
Buffer
類是一個全域性變數,使用時無需 require('buffer').Buffer
。
小應用:程式碼
將圖片轉換為base64編碼及從base64編碼轉換為圖片
Stream
流(stream)是 Node.js 中處理流式資料的抽象介面。 stream
模組用於構建實現了流介面的物件。
Node.js 提供了多種流物件。 例如,HTTP 伺服器的請求和 process.stdout
都是流的例項。
流可以是可讀的、可寫的、或者可讀可寫的。 所有的流都是 EventEmitter
的例項。
使用方法如下:
const stream = require('stream');
複製程式碼
參考
上面的demo小例都來自慕課課程《進擊的Node.js繼承》一、二,但已下架╮(╯=╰)╭