数组和ArrayBuffer有什么区别?

我只是想知道为什么每个人都使用ArrayBuffer而不是一个正常的arraystring或stringJSON从服务器发送消息到客户端。 效率更高吗?

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

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

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

当你创build一个正常的数组时,在很多情况下你不会得到一组正确的连续内存,因为数组可以包含任何不同types的对象的组合。 当你有dynamic数据和多种types(经常发生在JS)时,这是非常有用的,但是当你知道你需要的确切的内存布局时,它并不是那么有用。

这也允许您在字节级别查看数据。 例如,在二进制数据格式中,相当常见的是有一个n字节长的标识符号,一个长度m字节的字段,告诉你有多less字节用于这个字段,以及m个字节的数据实际上构成了数据字段。

 [ identifier ][ bytes of data ][ data ] 

使用ArrayBuffer,您可以select使用各种视图在字节级别上移动数据。 一个普通的数组不允许你在这个粒度级别上移动数据,因为没有对内存布局做出任何保证。

最后,因为您正在告诉编译器/解释器到底要使用多less空间以及如何查看它,所以在处理数据时可以进行更高级的优化。 在遍历这些数据时,不需要通过内存来进行计算。 相反,它知道在内存中前进多远以find下一个数据点。

至于Uint8Array是什么,它是一个types数组。 从本质上讲,它告诉编译器/解释器,你将以8位uint的forms独占访问这些数据,这也使得它可以做出更好的优化。 然后你可以使用标准的数组索引( arr[0], arr[1], etc. ),你将得到数组中等价的uint值。

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