es6-二进制数组

直接处理二进制数据,提升脚本性能。

数据类型字节长度含义范围
Int8Array18位带符号整数-128-127
-2^7 - 2^7-1
Uint8Array18位不带符号整数0-255
Uint8ClampedArrayy18位不带符号整数(自动过滤溢出)
Int16216位带符号整数
Uint16216位不带符号整数
Int32432位带符号整数
Uint32432位不带符号整数
Float32432位浮点数
Float64864位浮点数

ArrayBuffer

代表了存储二进制数据的一段内存,不能直接读写。通过视图(TypedArray/DataView)以指定格式进行读/写.

// 生成一段32字节的内存区域,默认填充 0 
var buffer = new ArrayBuffer(32);
// 通过创建视图,对buffer进行读写
var view = new DataView(buffer);
view.getUint8(0);                  // 以不带符号的8位整数读取第一个元素 为 0

.prototype.byteLength
返回分配的内存区域的字节长度。

buffer.byteLength;         // 32

.prototype.slice()
截取部分二进制数据并生成一个新的实例对象。

var buffer_1 = buffer.slice(0,4);
var view_1 = new DataView(buffer_1);
view_1.setUint8(0,12);     
             
view.getUint8(0);                  // 0
view_1.getUint8(0);             // 12 

.isView() 静态方法
返回一个布尔值,是否是视图实例。

ArrayBuffer.isViewe(buffer);        // false
ArrayBuffer.isView(view);       // true

TypedArray

  用于处理简单同一个类型的二进制数据。支持9中类型的视图,Uint8Array/Int16Array/Float32Array

  • 参数定义(buffer[,byteOffset=0,length]) 指向的buffer实例、起始点、长度。

      var typed = new Int32Array(buffer);
      typed[0] = 1;
      var typed_2 = new Uint8Array(buffer);
      typed_2[0] =2;             // 操作的时同一块内存,typed[0] = 2
    

    接受一个数组作为参数,并完成内存分配。

      var typed_3 = new Uint8Array([3,4,5]);
      // typed_3 [4,5,6]
    

    byteOffset必须是实例对象的类型的倍数

      var t8 = new Uint8Array(buffer,1,3); // 建立从1开始,长度为3 的视图
      var t16 = new Uint16Array(buffer,1,3); // Error ,byteOffset必须是 2 的倍数。
    

    可以使用DataView 从任意位置读取字节。

  • 额外的实例化方法

    • TypedArray(length) 直接分配内存生成。
    • TypedArray(typedArray)接受另一个TypedArray实例作为参数,且开辟了新内存区域。
    • TypedArray(array)使用普通的数组实例化,开辟了新内存并建立视图。

    普通数组的方法可用于TypedArray数组。没有concat方法,可自定义实现。

  • .BYTES_PER_ELEMENT
    标识数据类型占据的字节数。

  • 实例的方法.prototype

  1. .buffer
    返回ArrayBuffer对象。

  2. .byteLength/.byteOffset
    返回占据的内存长度以及是从哪个字节开始的。

  3. .length
    返回的是成员的长度。

  4. .set(array[,byteOffset]) byteOffset开始复制的位置。
    复制数组(普通数组、TypedArray),开辟新内存区域存储。

  5. .subarray(start,end) 截取视图的一部分建立新的视图。

  6. .slice()

  • TypedArray.of() 将参数转换为实例

     Uint8Array.of(3,4);
    
  • TypedArray.from() 将一个可遍历的数据结构作为参数,返回一个基于此结构的TypedArray实例。接受第二参数,对元素进行遍历,类似map()方法。

字节序

数值在内存中的表示方式。

  • 小端字节序 将一个数值中决定其大小的重要字节放在最后面,不重要的放到前面。

  • 大端字节序 与小端字节序相反,最重要的放到最前面。


小端字节序,不同的结果展现。

var i16 = new Uint16Array([2,4,6]);
[...i16.values()];           //   [2,4,6]
var i8 = new Uint8Array(i16.buffer);
[...i8.values()];         // [2,0,4,0,6,0]
溢出

超出视图范围的数值会出现溢出。TypedArray处理溢出方式为求余值。

  • 正向溢出,大于范围最大值;最后的值等于当前数据类型的最小值加上余值,再减去 1。
  • 负向溢出就等于当前数据类型的最大值减去余值,再加上1 。

DataView

复合视图在同一段内存中存放不同类型的数据。
  用于读写复杂二进制数据。是一组构造函数 ,可以自定义复合格式视图。即第一个字节是Uint8,第二个字节是Int16等等,还可以自定义字节序。

var view = new DataView(buffer[,byteOffset,byteLength]);
  • 读取内存的方法:getInt8()...getFloat64 共8中。不包括Uint8ClampedArrayy
    第一个参数为字节序号,第二个字节为存储方式(针对读取两个或两个以上字节),默认大端存储。

      view.getInt8(0);
      view.getInt8(0,true);      // 小端字节序读取。
    
  • 写入内存:setInt8...setFloat64共8种。
    第一个参数为字节序号,第二个字节为写入的数据。第三个参数为存储方式(针对读取两个或两个以上字节),默认大端存储。

实际应用

  • ajax
  • Canvas 图像二进制像素数据处理,专有的数据类型Uint8ClampedArray.
  • WebSocket
  • Fetch API
  • File API
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heroboyluck

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值