数组和ArrayBuffer有什么区别?

时间:2016-04-18 21:18:18

标签: javascript node.js websocket socket.io arraybuffer

我只是想知道为什么每个人都使用ArrayBuffer而不是普通arraystring或字符串JSON来从服务器向客户端发送消息。它效率更高吗?

另外,只是想知道Uint8Array是什么,它是如何不同,在哪里使用这两个等。

我目前正在使用带有Socket.io的Node.js,但如果它是更好的方法,我很乐意改为纯WebSocket

1 个答案:

答案 0 :(得分:12)

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

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

这也允许您在字节级别查看数据。例如,二进制数据格式中常见的是 n 字节长标识符编号, m 字节长字段,告诉您使用了多少字节此字段以及实际构成数据字段的 m' 字节数据。

[ identifier ][ bytes of data ][ data ]

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

最后,因为您告诉编译器/解释器完全您将使用多少空间,完全您将如何查看它,它可以在处理该数据时进行更高级的优化。在遍历该数据时,它不必通过内存进行计算跳跃。相反,它知道完全在内存中向前移动多远以找到下一个数据点。

至于Uint8Array是什么,它是一个打字数组。从本质上讲,它告诉编译器/解释器您将仅以8位uint的形式访问此数据,这再次允许它进行更好的优化。然后,您可以在其上使用标准数组索引(arr[0], arr[1], etc.),并且您将从数组中获取等效的uint值。

TL; DR 当确切的数据格式已知时,它们占用的空间更少,允许您更精确地移动数据,并为编译器/解释器提供更多优化选项。

相关问题