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