美文网首页@IT·互联网
050|JavaScript 解析缓存

050|JavaScript 解析缓存

作者: 中年小钢炮 | 来源:发表于2017-05-26 01:42 被阅读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

    相关文章

      网友评论

        本文标题:050|JavaScript 解析缓存

        本文链接:https://www.haomeiwen.com/subject/udoaxxtx.html