Skip to content

JavaScript中的ArrayBuffer

🕒 Published at:

写在前面的

在尝试用国密算法实现 jwt 的时候, 发现可以使用的库很少, 便根据 jwt 的生成规则和国密 SM3 算法自行参考实现。SM3 是国密算法中的哈希散列算法, 生成单向指纹校验数据有着重要的意义。在生成 jwt 的指纹部分, 尝试使用 HMACSM3 替代掉 HMACSHA256算法。

HMACSM3 可用的 JavaScript 库确实没发现, 参考了 Java 版本进行自行实现。其中涉及到了二进制数据的位运算, 并且 byte-fe/gm-crypto 中的 SM3 的返回值类型为 ArrayBuffer, 因此觉得研究此 ES6 的新内置对象很有意义。

关于 ArrayBuffer

在 MDN 中, 对于 ArrayBuffer 对象表述为表示通用的、固定长度的原市二进制数据缓冲区, 在其他语言中被称为"byte array(字节数组)"

在 golang 中, byte array 和 string 的类型转化很常见。byte array在不同语言中均有用处, 可以提高程序计算的性能。

JavaScript 的 ArrayBuffer 设计目的也同样如此, 需要注意的这又是一个 array-like object, 使用 TypedArray or DataView 对象进行操作。

语法

new ArrayBuffer(length)

  • 参数
参数描述
length要创建的 ArrayBuffer 的大小, 单位为字节
  • 返回值

一个指定大小的 ArrayBuffer 对象, 其内容被初始化为 0

  • 异常

如果 lengthNumber.MAX_SAFE_INTEGER (≥2**53) 或为 负数, 会抛 RangeError 异常。

属性

  • ArrayBuffer,length

ArrayBuffer 构造函数的 length 属性, 其值为 1

  • ArrayBuffer.prototype.byteLength

只读, 表示 ArrayBuffer 的 byte 大小, 在 ArrayBuffer 构造完成时生成, 不可更改。

方法

  • ArrayBuffer.isView(arg)

如果参数是 ArrayBuffer 的视图实例则返回 true, 例如 TypedArray or DataView 对象;否则返回 false

  • ArrayBuffer.transfer(oldBuffer [, newByteLength]) 实验性

返回一个新的 ArrayBuffer 对象, 其内容取自 oldBuffer 中的数据, 并根据 newByteLength 的大小对数据进行截取或补 0

兼容性

就让 IE 消失于世间吧~