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?
网友评论