数组和ArrayBuffer有什么区别?

Luk*_*non 9 javascript websocket node.js socket.io arraybuffer

我只是想知道为什么每个人都使用ArrayBuffer而不仅仅是正常的array,string或者用字符串化JSON来从服务器向客户端发送消息.它效率更高吗?

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

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

Mik*_*uck 15

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

当您创建普通数组时,在许多情况下您将无法获得一组适当的连续内存,因为数组可以包含不同类型对象的任意组合.当您将动态数据和多个类型放在一起时(通常在JS中发生),这非常有用,但在您知道所需内存的确切布局时则不太有用.

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

[ identifier ][ bytes of data ][ data ]
Run Code Online (Sandbox Code Playgroud)

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

最后,因为你是在告诉编译器/解释正是你要多大的空间使用,究竟如何你要查看它,它可以用数据时做更多的高级优化.在遍历该数据时,它不必通过内存进行计算跳跃.相反,它确切知道在内存中向前移动多远以找到下一个数据点.

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

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