前言
今天仔细阅读了MDN的这篇guide:Using XMLHttpRequest,在里面发现了好多以前听都没听过的概念,尤其是那些不为人知的Object,所以在这里特地把它们拎出来讲一下,不求多深入,只想粗略了解一下。
1、ArrayBuffer
为什么需要这么一种数据类型呢?众所周知,Array对象可以动态变化长度并且可以包含任意类型的JS值。JS引擎对其优化以便可以让这些数组执行起来很快。但是随着web应用变得越来越强大,添加一些诸如音视频的操作特性,使用WebSockets访问原始数据等等和底层有关的行为时,就会发现如果JS能够直接快速且简单地操作原始数据那是相当有用的,于是就产生了ArrayBuffer这样的数据类型。
ArrayBuffer
对象用于表示一个通用的固定长度原始二进制数据缓存。你不能直接操作ArrayBuffer
的内容。但是你可以使用特定的格式来创建typed array objects或DataView对象以表示这种类型的buffer,然后就可以用来读或者写缓存的内容。那么什么是typed array objects
和DataView
?
1.1、DataView
DataView 视图提供一个底层接口来读取和写入多种数据类型到一个ArrayBuffer
中去而忽略平台的大小端。
语法
new DataView(buffer [, byteOffset [, byteLength]])
- buffer:一个已存在的
ArrayBuffer
,用来存储新的DataView对象的; - byteOffset:以字节为单位,新视图存放在相对于指定buffer的第一个字节的偏移。如果没有指定,那么buffer的视图将会从第一个字节开始。
- byteLength:字节数组的长度。如果没有指定,视图的长度将会匹配buffer的长度。
该对象提供了众多的方法来读写整形8/16/32比特的有符号整数或者无符号整数以及32/64比特的浮点数,比如:
var buffer = new ArrayBuffer(16); // 创建一个16字节的ArrayBuffer
// 创建一个DataView的对象,放在上面创建的buffer中,偏移为0,
// 也就是在上述buffer中的头部
var dv = new DataView(buffer, 0);
// 以小端形式写入一个有符号的16比特的整数到视图中去
dv.setInt16(0, 42, true);
// 以大端形式读取
dv.setInt16(0, 42);
// 以小端形式读取
dv.setInt16(0, 42, true);
大家知道第一个读取的结果和第二个结果是什么吗?答案是:10752
和42
。原因其实很简单的:
42的二进制是:00000000 00101010
,如果是小端形式写入buffer的话,那么假设写入到的内存地址是0x10000000
(32bit的系统):
内存地址:低-------------------------------------高