IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    050|JavaScript 解析缓存

    shendao发表于 2017-06-01 14:56:37
    love 0

    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。

    好了,这一节就到这里。JavaScript中缓存的操作,希望你掌握了。

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

    请继续关注我的课程,我将在后续课程中帮大家依次解答上述问题。



沪ICP备19023445号-2号
友情链接