[TOC]
## 概述
Buffer對象是Node.js用來處理二進制數據的一個接口。JavaScript比較擅長處理Unicode數據,對于處理二進制格式的數據(比如TCP數據流),就不太擅長。Buffer對象就是為了解決這個問題而提供的。該對象也是一個構造函數,它的實例代表了V8引擎分配的一段內存,基本上是一個數組,成員都為整數值。
Buffer是Node原生提供的全局對象,可以直接使用,不需要`require('buffer')`。
Buffer對象與字符串的互相轉換,需要指定編碼格式。目前,Buffer對象支持以下編碼格式。
* ascii
* utf8
* utf16le:UTF-16的小頭編碼,支持大于U+10000的四字節字符。
* ucs2:utf16le的別名。
* base64
* hex:將每個字節轉為兩個十六進制字符。
V8引擎將Buffer對象占用的內存,解釋為一個整數數組,而不是二進制數組。所以,`new Uint32Array(new Buffer([1,2,3,4]))`,生成的Uint32Array數組是一個4個成員的Uint32Array數組,而不是只有單個成員([0x1020304]或者[0x4030201])的。
注意,這時類型化數組所對應的內存是從Buffer對象拷貝的,而不是共享的。類型化數組的buffer屬性,保留指向原Buffer對象的指針。
類型化數組的操作,與Buffer對象的操作基本上是兼容的,只有輕微的差異。比如,類型化數組的slice方法返回原內存的拷貝,而Buffer對象的slice方法創造原內存的一個視圖(view)。
## Buffer構造函數
Buffer作為構造函數,可以用new命令生成一個實例,它可以接受多種形式的參數。
~~~
// 參數是整數,指定分配多少個字節內存
var hello = new Buffer(5);
// 參數是數組,數組成員必須是整數值
var hello = new Buffer([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
hello.toString() // 'Hello'
// 參數是字符串(默認為utf8編碼)
var hello = new Buffer('Hello');
// 參數是字符串(不省略編碼)
var hello = new Buffer('Hello', 'utf8');
// 參數是另一個Buffer實例,等同于拷貝后者
var hello1 = new Buffer('Hello');
var hello2 = new Buffer(hello1);
~~~
## 類的方法
### Buffer.isEncoding()
Buffer.isEncoding方法返回一個布爾值,表示Buffer實例是否為指定編碼。
~~~
Buffer.isEncoding('utf8')
// true
~~~
### Buffer.isBuffer()
Buffer.isBuffer方法接受一個對象作為參數,返回一個布爾值,表示該對象是否為Buffer實例。
~~~
Buffer.isBuffer(Date) // false
~~~
### Buffer.byteLength()
Buffer.byteLength方法返回字符串實際占據的字節長度,默認編碼方式為utf8。
~~~
Buffer.byteLength('Hello', 'utf8') // 5
~~~
### Buffer.concat()
Buffer.concat方法將一組Buffer對象合并為一個Buffer對象。
~~~
var i1 = new Buffer('Hello');
var i2 = new Buffer(' ');
var i3 = new Buffer('World');
Buffer.concat([i1, i2, i3]).toString()
// 'Hello World'
~~~
需要注意的是,如果Buffer.concat的參數數組只有一個成員,就直接返回該成員。如果有多個成員,就返回一個多個成員合并的新Buffer對象。
Buffer.concat方法還可以接受第二個參數,指定合并后Buffer對象的總長度。
~~~
var i1 = new Buffer('Hello');
var i2 = new Buffer(' ');
var i3 = new Buffer('World');
Buffer.concat([i1, i2, i3], 10).toString()
// 'Hello Worl'
~~~
省略第二個參數時,Node內部會計算出這個值,然后再據此進行合并運算。因此,顯式提供這個參數,能提供運行速度。
## 實例屬性
### length
length屬性返回Buffer對象所占據的內存長度。注意,這個值與Buffer對象的內容無關。
~~~
buf = new Buffer(1234);
buf.length // 1234
buf.write("some string", 0, "ascii");
buf.length // 1234
~~~
上面代碼中,不管寫入什么內容,length屬性總是返回Buffer對象的空間長度。如果想知道一個字符串所占據的字節長度,可以將其傳入Buffer.byteLength方法。
length屬性是可寫的,但是這會導致未定義的行為,不建議使用。如果想修改Buffer對象的長度,建議使用slice方法返回一個新的Buffer對象。
## 實例方法
### write()
write方法可以向指定的Buffer對象寫入數據。它的第一個參數是所寫入的內容,第二個參數(可省略)是所寫入的起始位置(從0開始),第三個參數(可省略)是編碼方式,默認為utf8。
~~~
var buf = new Buffer(5);
buf.write('He');
buf.write('l', 2);
buf.write('lo', 3);
console.log(buf.toString());
// "Hello"
~~~
### slice()
slice方法返回一個按照指定位置、從原對象切割出來的Buffer實例。它的兩個參數分別為切割的起始位置和終止位置。
~~~
var buf = new Buffer('just some data');
var chunk = buf.slice(4, 9);
chunk.toString()
// "some"
~~~
### toString()
toString方法將Buffer對象,按照指定編碼(默認為utf8)轉為字符串。
~~~
var hello = new Buffer('Hello');
hello // <Buffer 48 65 6c 6c 6f>
hello.toString() // "Hello"
~~~
toString方法可以只返回指定位置內存的內容,它的第二個參數表示起始位置,第三個參數表示終止位置,兩者都是從0開始計算。
~~~
var buf = new Buffer('just some data');
console.log(buf.toString('ascii', 4, 9));
// "some"
~~~
### toJSON()
toJSON方法將Buffer實例轉為JSON對象。如果JSON.stringify方法調用Buffer實例,默認會先調用toJSON方法。
~~~
var buf = new Buffer('test');
var json = JSON.stringify(buf);
json // '[116,101,115,116]'
var copy = new Buffer(JSON.parse(json));
copy // <Buffer 74 65 73 74>
~~~
- 第一章 導論
- 1.1 前言
- 1.2 為什么學習JavaScript?
- 1.3 JavaScript的歷史
- 第二章 基本語法
- 2.1 語法概述
- 2.2 數值
- 2.3 字符串
- 2.4 對象
- 2.5 數組
- 2.6 函數
- 2.7 運算符
- 2.8 數據類型轉換
- 2.9 錯誤處理機制
- 2.10 JavaScript 編程風格
- 第三章 標準庫
- 3.1 Object對象
- 3.2 Array 對象
- 3.3 包裝對象和Boolean對象
- 3.4 Number對象
- 3.5 String對象
- 3.6 Math對象
- 3.7 Date對象
- 3.8 RegExp對象
- 3.9 JSON對象
- 3.10 ArrayBuffer:類型化數組
- 第四章 面向對象編程
- 4.1 概述
- 4.2 封裝
- 4.3 繼承
- 4.4 模塊化編程
- 第五章 DOM
- 5.1 Node節點
- 5.2 document節點
- 5.3 Element對象
- 5.4 Text節點和DocumentFragment節點
- 5.5 Event對象
- 5.6 CSS操作
- 5.7 Mutation Observer
- 第六章 瀏覽器對象
- 6.1 瀏覽器的JavaScript引擎
- 6.2 定時器
- 6.3 window對象
- 6.4 history對象
- 6.5 Ajax
- 6.6 同域限制和window.postMessage方法
- 6.7 Web Storage:瀏覽器端數據儲存機制
- 6.8 IndexedDB:瀏覽器端數據庫
- 6.9 Web Notifications API
- 6.10 Performance API
- 6.11 移動設備API
- 第七章 HTML網頁的API
- 7.1 HTML網頁元素
- 7.2 Canvas API
- 7.3 SVG 圖像
- 7.4 表單
- 7.5 文件和二進制數據的操作
- 7.6 Web Worker
- 7.7 SSE:服務器發送事件
- 7.8 Page Visibility API
- 7.9 Fullscreen API:全屏操作
- 7.10 Web Speech
- 7.11 requestAnimationFrame
- 7.12 WebSocket
- 7.13 WebRTC
- 7.14 Web Components
- 第八章 開發工具
- 8.1 console對象
- 8.2 PhantomJS
- 8.3 Bower:客戶端庫管理工具
- 8.4 Grunt:任務自動管理工具
- 8.5 Gulp:任務自動管理工具
- 8.6 Browserify:瀏覽器加載Node.js模塊
- 8.7 RequireJS和AMD規范
- 8.8 Source Map
- 8.9 JavaScript 程序測試
- 第九章 JavaScript高級語法
- 9.1 Promise對象
- 9.2 有限狀態機
- 9.3 MVC框架與Backbone.js
- 9.4 嚴格模式
- 9.5 ECMAScript 6 介紹
- 附錄
- 10.1 JavaScript API列表
- 草稿一:函數庫
- 11.1 Underscore.js
- 11.2 Modernizr
- 11.3 Datejs
- 11.4 D3.js
- 11.5 設計模式
- 11.6 排序算法
- 草稿二:jQuery
- 12.1 jQuery概述
- 12.2 jQuery工具方法
- 12.3 jQuery插件開發
- 12.4 jQuery.Deferred對象
- 12.5 如何做到 jQuery-free?
- 草稿三:Node.js
- 13.1 Node.js 概述
- 13.2 CommonJS規范
- 13.3 package.json文件
- 13.4 npm模塊管理器
- 13.5 fs 模塊
- 13.6 Path模塊
- 13.7 process對象
- 13.8 Buffer對象
- 13.9 Events模塊
- 13.10 stream接口
- 13.11 Child Process模塊
- 13.12 Http模塊
- 13.13 assert 模塊
- 13.14 Cluster模塊
- 13.15 os模塊
- 13.16 Net模塊和DNS模塊
- 13.17 Express框架
- 13.18 Koa 框架