在ES6引入TypedArray之前,JavaScript語(yǔ)言沒(méi)有讀取或操作二進(jìn)制數(shù)據(jù)流的機(jī)制。Buffer類被引入作為Nodejs的API的一部分,使其可以在TCP流和文件系統(tǒng)操作等場(chǎng)景中處理二進(jìn)制數(shù)據(jù)流?,F(xiàn)在TypedArray已經(jīng)被添加進(jìn)ES6中,Buffer類以一種更優(yōu)與更適合Node.js用例的方式實(shí)現(xiàn)了Uint8Array。
由于應(yīng)用場(chǎng)景不同,在Node中,應(yīng)用需要處理網(wǎng)絡(luò)協(xié)議、操作數(shù)據(jù)庫(kù)、處理圖片、接收上傳文件等,在網(wǎng)絡(luò)流和文件的操作中,還要處理大量二進(jìn)制數(shù)據(jù),JavaScript自有的字符串遠(yuǎn)遠(yuǎn)不能滿足這些需求,于是Buffer對(duì)象應(yīng)運(yùn)而生
Buffer是一個(gè)典型的JavaScript與C++結(jié)合的模塊,它將性能相關(guān)部分用C++實(shí)現(xiàn),將非性能相關(guān)的部分用JavaScript實(shí)現(xiàn)。Buffer類的實(shí)例類似于整數(shù)數(shù)組,除了其是大小固定的、且在V8堆外分配物理內(nèi)存。Buffer的大小在其創(chuàng)建時(shí)就已確定,且不能調(diào)整大小
由于Buffer太過(guò)常見(jiàn),Node在進(jìn)程啟動(dòng)時(shí)就已經(jīng)加載了它,并將其放在全局對(duì)象(global)上。所以在使用Buffer時(shí),無(wú)須通過(guò)require()即可直接使用
/*{ [Function: Buffer] poolSize: 8192, from: [Function], alloc: [Function], allocUnsafe: [Function], allocUnsafeSlow: [Function], isBuffer: [Function: isBuffer], compare: [Function: compare], isEncoding: [Function], concat: [Function], byteLength: [Function: byteLength] } */console.log(Buffer);在 Node.js v6之前的版本中,Buffer實(shí)例是通過(guò)Buffer構(gòu)造函數(shù)創(chuàng)建的,它根據(jù)提供的參數(shù)返回不同的 Buffer,而新版本的nodejs則提供了對(duì)應(yīng)的方法
1、new Buffer(size)。傳一個(gè)數(shù)值作為第一個(gè)參數(shù)給Buffer()(如new Buffer(10)),則分配一個(gè)指定大小的新建的Buffer對(duì)象
分配給這種Buffer實(shí)例的內(nèi)存是未初始化的(沒(méi)有用0填充)。雖然這樣的設(shè)計(jì)使得內(nèi)存的分配非??欤逊峙涞膬?nèi)存段可能包含潛在的敏感舊數(shù)據(jù)
這種Buffer實(shí)例必須手動(dòng)地被初始化,可以使用buf.fill(0)或?qū)憹M這個(gè)Buffer。雖然這種行為是為了提高性能而有意為之的,但開(kāi)發(fā)經(jīng)驗(yàn)表明,創(chuàng)建一個(gè)快速但未初始化的Buffer與創(chuàng)建一個(gè)慢點(diǎn)但更安全的Buffer之間需要有更明確的區(qū)分
var buf = new Buffer(5);console.log(buf);//<Buffer e0 f7 1d 01 00>buf.fill(0);console.log(buf);//<Buffer 00 00 00 00 00>
[注意]當(dāng)我們?yōu)橐粋€(gè)Buffer對(duì)象分配空間大小后,其長(zhǎng)度就是固定的,不能更改
var buf = new Buffer(5);console.log(buf);//<Buffer b8 36 70 01 02>buf[0] = 1;console.log(buf);//<Buffer 01 36 70 01 02>buf[10] = 1;console.log(buf);//<Buffer 01 79 43 6f 6e>
在新版本中,由Buffer.allocUnsafe(size)方法替代,來(lái)分配一個(gè)大小為 size 字節(jié)的新建的沒(méi)有用0填充的Buffer??梢允褂胋uf.fill(0)初始化Buffer實(shí)例為0
新聞熱點(diǎn)
疑難解答
圖片精選