@IT·互联网

050|JavaScript 解析缓存

2017-05-26  本文已影响132人  中年小钢炮

JavaScript中可以创建和引用原始内存数据,这是通过数组缓存来完成的。

数组缓存(ArrayBuffer),是对一块内存数据的封装,即一连串字节。数组缓存本身是无意义的,它就是一串字节。要想使它变得有意义,需要有解析器来解析这段字节。

DataView

DataView就是其中一个解析器。DataView是JavaScript中的一个类型,我们来看一下DataView的构造函数:

new DataView(buffer [, byteOffset [, byteLength]])

参数buffer指的是ArrayBuffer,byteOffset指的是从ArrayBuffer的第byteOffset个字节开始解析,byteLength指的是只解析从byteOffset开始的共计byteLength个字节。

通过一下例子来理解DataView:

var buffer = new ArrayBuffer(2)

var writeDataView = new DataView(buffer)
writeDataView.setInt16(0, 256) // 将第0个字节开始,设置一个int16,值为256

var readDataView = new DataView(buffer)
console.log(readDataView.getInt16(0)) // 从第0个字节,读取一个int16

上述代码分别创建了两个DataView,一个writeDataView用于将buffer写入数据,另一个是readDataView,用于向buffer读取数据。
我们来看一下运行结果:

256

可以看到,writeDataView向buffer中写了什么数据,readDataView就读出了什么数据。

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个字节开始,设置一个int16,值为256

var value =  new Int16Array(buffer)[0] // 以Int16来解析数据,获取第0个元素
console.log(value) 

我们来看一下运行结果:

256

大小端

大小端问题指的是多字节数据排序问题。例如256,转换为16进制是0x0100,由两个字节组成:0x01、0x00。在字节序上,就拥有0x0100、0x0001两种模式。这两种模式就叫做大小端 。

DataView的setInt16方法默认是大端数据,而TypedArray默认是运行主机的模式(可能为小端,也可能为大端)。所以用DataView写入的数据,用TypedArray读取时要注意大小端模式一致。

例如,下例中大小端模式不一埃,导致解析出错:

var buffer = new ArrayBuffer(2)

var writeDataView = new DataView(buffer)
writeDataView.setInt16(0, 256) // 默认大端

var value =  new Int16Array(buffer)[0] // 默认主机模式,本测试机为小端
console.log(value) 

我们看一下运行结果:

1

上例中,writeDataView以默认的大端模式将256写入buffer,而Int16Array以小端模式读取,大小端模式不同,导致解析数据出错,从而输出了1。

OK,完结。

什么是继承?
什么是prototype?
什么是proto

上一篇下一篇

猜你喜欢

热点阅读