JS 类型化数组 到底是何物???
前言:
在 JavaScript 这门语言中,我们所有人都必须对数组足够熟悉,知晓数组本质上是动态的,并且可以容纳任何 JavaScript 对象。不过,如果你曾经使用过类似于 C 语言这样的其他语言,你应该知道其数组本质上不是动态的。而且你只能在该数组中存储特定的数据类型,毕竟从性能角度来看,这可以确保数组效率更高。但数组的动态化与存储信息类型的多样化其实并没有使 JavaScript 数组效率低下。在 JavaScript 引擎优化的帮助下,JavaScript 中数组的执行速度其实非常快。
随着 Web 应用程序功能越来越强大,我们开始需要让 Web 应用程序处理和操纵原始二进制数据。JavaScript
数组无法处理这些原始二进制数据,也因此我们引入了 JavaScript 的类型化数组。
类型化数组
类型化数组是与数组非常相似的对象,但是它提供了一种将原始二进制数据写入内存缓冲区的机制。所有主要浏览器均很好地支持此功能,并且 ES6 已将其集成到 JavaScript 核心框架中,也可以访问诸如 map()、filter()等 Array 方法 。我强烈建议你浏览本文结尾处提到的资源,以更深入了解类型化数组。
组成
类型化数组由两个主要部分组成,Buffer 和 View。
缓冲区
Buffer 是 ArrayBuffer 类型的对象,表示一个数据块。此原始二进制数据块无法被单独访问或修改。你可能好奇,无法访问或修改的数据对象的能有什么用途。实际上视图是缓冲区的读写接口。
视图
View 是一个对象,允许你访问和修改存储在 ArrayBuffer 中的原始二进制内容。一般来说有两种视图。
- TypedArray 对象的实例
这些类型的对象与普通数组非常相似,但是仅存储单一类型的数值数据。诸如 Int8、Uint8、Int16、Float32 就是类型化数组的数据类型。类型中的数字表示为数据类型分配的位数。例如,Int8 表示 8 位的整数。 - DataView 对象的实例
DataView 是一个低级接口,提供了一个 getter / setter API 来读取和写入任意数据到缓冲区。这很大程度上方便了我们的开发,尤其是需要在单个类型化数组中处理多种数据类型时。
使用 DataView 的另一个好处是,它可以让你控制数据的字节序 —— 类型化数组使用平台的字节序。当然如果你的程序运行在本地,这将不是问题,因为你的设备将使用与输入数组相同的字节序。在大多数情况下,你的类型化数组将为低端字节序,因为英特尔采取的是小端字节序。由于英特尔在计算机处理器中非常普遍,因此大多数时候不会出现问题。但是,如果将小端字节序编码的数据传输到使用大端字节序编码的设备,则会导致读取时候的错误,最终可能导致数据的丢失。由于 DataView 使你可以控制字节序的方向,因此你可以在必要时使用它。
是什么使它们与普通数组不同
如前所述,普通的 JavaScript 数组已通过 JavaScript 引擎进行了优化,你没必要为了提升性能而使用类型化数组,因为这不会给你带来太多升级。但是有些特性使类型化数组不同于普通数组,这才可能是你选择它们的原因。
- 让你能够处理原始二进制数据
- 由于它们处理的数据类型是有限的,因此与普通数组相比,你的引擎更易优化类型化数组,因为普通数组的优化其实是一个非常复杂的过程。
- 不能保证普通数组永远都能得到优化,因为你的引擎可