JavaScript中可以創(chuàng)建和引用原始內(nèi)存數(shù)據(jù),這是通過數(shù)組緩存來完成的。
數(shù)組緩存(ArrayBuffer),是對一塊內(nèi)存數(shù)據(jù)的封裝,即一連串字節(jié)。數(shù)組緩存本身是無意義的,它就是一串字節(jié)。要想使它變得有意義,需要有解析器來解析這段字節(jié)。
DataView
DataView就是其中一個解析器。DataView是JavaScript中的一個類型,我們來看一下DataView的構(gòu)造函數(shù):
new DataView(buffer [, byteOffset [, byteLength]])
參數(shù)buffer指的是ArrayBuffer,byteOffset指的是從ArrayBuffer的第byteOffset個字節(jié)開始解析,byteLength指的是只解析從byteOffset開始的共計(jì)byteLength個字節(jié)。
通過一下例子來理解DataView:
var buffer = new ArrayBuffer(2)
var writeDataView = new DataView(buffer)
writeDataView.setInt16(0, 256) // 將第0個字節(jié)開始,設(shè)置一個int16,值為256
var readDataView = new DataView(buffer)
console.log(readDataView.getInt16(0)) // 從第0個字節(jié),讀取一個int16
上述代碼分別創(chuàng)建了兩個DataView,一個writeDataView用于將buffer寫入數(shù)據(jù),另一個是readDataView,用于向buffer讀取數(shù)據(jù)。
我們來看一下運(yùn)行結(jié)果:
256
可以看到,writeDataView向buffer中寫了什么數(shù)據(jù),readDataView就讀出了什么數(shù)據(jù)。
TypedArray
ArrayBuffer除了可以用DataView來解析,還可以用TypedArray來解析。
TypedArray是JavaScript中的一系列類型*Array。如:
Int8Array
Uint8Array
Int16Array
Uint16Array
Int32Array
Uint32Array
可以將前述代碼的readDataView改寫成使用readDataView:
var buffer = new ArrayBuffer(2)
var writeDataView = new DataView(buffer)
writeDataView.setInt16(0, 256, true) // 將第0個字節(jié)開始,設(shè)置一個int16,值為256
var value = new Int16Array(buffer)[0] // 以Int16來解析數(shù)據(jù),獲取第0個元素
console.log(value)
我們來看一下運(yùn)行結(jié)果:
256
大小端
大小端問題指的是多字節(jié)數(shù)據(jù)排序問題。例如256,轉(zhuǎn)換為16進(jìn)制是0x0100,由兩個字節(jié)組成:0x01、0x00。在字節(jié)序上,就擁有0x0100、0x0001兩種模式。這兩種模式就叫做大小端 。
DataView的setInt16方法默認(rèn)是大端數(shù)據(jù),而TypedArray默認(rèn)是運(yùn)行主機(jī)的模式(可能為小端,也可能為大端)。所以用DataView寫入的數(shù)據(jù),用TypedArray讀取時要注意大小端模式一致。
例如,下例中大小端模式不一埃,導(dǎo)致解析出錯:
var buffer = new ArrayBuffer(2)
var writeDataView = new DataView(buffer)
writeDataView.setInt16(0, 256) // 默認(rèn)大端
var value = new Int16Array(buffer)[0] // 默認(rèn)主機(jī)模式,本測試機(jī)為小端
console.log(value)
我們看一下運(yùn)行結(jié)果:
1
上例中,writeDataView以默認(rèn)的大端模式將256寫入buffer,而Int16Array以小端模式讀取,大小端模式不同,導(dǎo)致解析數(shù)據(jù)出錯,從而輸出了1。
OK,完結(jié)。
什么是繼承?
什么是prototype?
什么是proto?