数组和 ArrayBuffer 有什么区别?

What is the difference between an array and an ArrayBuffer?

我只是想知道为什么每个人都使用 ArrayBuffer 而不是普通的 arraystring 或字符串化的 JSON 来将消息从服​​务器发送到客户端.是不是更有效率?

此外,只是想知道 Uint8Array 是什么,它有何不同,两者在哪里使用等等。

我目前正在使用 Node.js 和 Socket.io,但如果这是更好的方法,我很乐意更改为纯 WebSockets。

ArrayBuffer 不仅仅是一个简单的数组。它包含原始二进制数据。这对于直接内存操作和保存非常有用space。

当您创建普通数组时,在许多情况下您不会获得一组适当的连续内存,因为数组可以包含不同类型对象的任意组合。当您同时拥有动态数据和多种类型时(在 JS 中经常发生),这很有用,但当您知道所需的 exact 内存布局时就没那么有用了。

这还允许您查看字节级别的数据。例如,在二进制数据格式中很常见有一个 n 字节长的标识符号,一个 m 字节长的字段告诉你有多少字节用于该字段,m' 字节的数据实际构成数据字段。

[ identifier ][ bytes of data ][ data ]

使用 ArrayBuffer,您可以选择使用各种视图在字节级别移动数据。常规数组不允许您以该粒度级别移动数据,因为无法保证内存布局。

最后,因为你告诉 compiler/interpreter 确切地 你要使用多少 space 和 确切地 你将如何查看它,它可以在处理该数据时进行更高级的优化。遍历该数据时,它不必计算内存中的跳跃。相反,它确切知道在内存中向前移动多远才能找到下一个数据点。

至于Uint8Array是什么,它是一个类型数组。本质上,它告诉 compiler/interpreter 您将以 8 位 uint 的形式专门访问此数据,这再次允许它进行更好的优化。然后您可以对其使用标准数组索引 (arr[0], arr[1], etc.),您将从数组中取回等效的 uint 值。

TL;DR 当确切的数据格式已知时,它们占用更少 space,允许您更准确地移动数据并给出 compiler/interpreter 更多优化选项。