类型化数组(Typed Array)也是HTML5中新引入的API。用一句话解释类型化数组就是:它是JS操作二进制数据的接口。 众所周知,直接操作二进制数据可以使程序更为高效, 尽管JS对常规数组做了很多优化(JS数组被实现为对象形式),但是不得不承认JS数组的效率一直不高。比如在WebGL中的图像数据传输, 如果使用原生的JS数组, 浏览器在与显卡通信时,必须将它转换为二进制形式,这一步较为耗时。正是因为有大量二进制数据的操作需求,所以ArrayBuffer应运而生。在Canvas(可参考本人canvas笔记canvas的基本原理)中,使用getImageDate()方法所返回的ImageData对象就是一个类数组对象,HTML标准中称其为CanvasPixelArray,它除了在值的处理方式上与ArrayBuffer中视图类型Unit8Array有点区别外,其他都一样(Unit8Array只能处理0-255的数字,而CanvasPixelArray可以处理更多)

对于刚接触类型化数组的概念看到这可能还是云里雾里,下面将逐一将我所理解的ArrayBuffer中的关键概念做个整理:

视图(View)

大多数资料中对于视图都是一句带过,比如这篇博客中(ArrayBuffer:类型化数组)对于视图的解释就是:

ArrayBuffer作为内存区域,可以存放多种类型的数据。不同数据有不同的存储方式,这就叫做“视图”。

当我刚看到上面的解释,还是无法体会“视图”的含义,暂且把ArrayBuffer的概念放一边, 想象一下,既然是操作二进制数据的接口,那么该如何操作他们呢, 比如8位二进制数1是00000001,我们肯定不会使用原始的二进制编程,那么当我们操作这个1时,肯定是以1的形式操作, 那么这里的1就是视图(view)了, 视图可以理解为方便理解的二进制数据。如果知道C语言,对于这个概念就不难把握了,比如C语言中的字符串实际是数字,那么这里的字符串也可以理解为“视图”。其实这里的视图就是类型化数组。

ArrayBuffer的概念

ArrayBuffer是一段不透明的内存区域(所谓不透明,就是无法直接操作的数据块),单位是字节(Byte)也就是8位,它的byteLength属性返回其内存大小。在JS中,通过构造函数的形式申明一段ArrayBuffer区域:

var a = new ArrayBuffer(10)
a.byteLength // =>10

在这段内存区域上,可以使用不同的视图来创建任意数量的类型化数组, 这些类型化数组也可以是重叠的。有八种不同的类型化数组(视图),分别为:

  • Int8Array:8位有符号整数,长度1个字节。

  • Uint8Array:8位无符号整数,长度1个字节。

  • Int16Array:16位有符号整数,长度2个字节。

  • Uint16Array:16位无符号整数,长度2个字节。

  • Int32Array:32位有符号整数,长度4个字节。

  • Uint32Array:32位无符号整数,长度4个字节。

  • Float32Array:32位浮点数,长度4个字节。

  • Float64Array:64位浮点数,长度8个字节。

这里引用这篇博客中(JavaScript中的ArrayBuffer详细介绍)的例子来解释ArrayBuffer区域中出现的重叠(也叫复合视图)现象:

var buffer = new ArrayBuffer(12)
var x = new Float32Array(buffer, 0, 2)
var y = new Float32Array(buffer, 4, 1)
x[1] = 7;
console.log(y[0]); // 7

原文中作者的解释过于简单。这里的y[0]之所以为7,是因为在buffer这段12个字节的内存区域中,申明来一个从0字节开始,长度为2的32位浮点数x(也就是说x占了前8个字节),再申明一个从第4个字节开始,长度为1的32位浮点数y,那么这里的yx实际上就是重叠的,x已经占了8个字节,而y是从第4个字节开始的。既然是重叠的,那么改变x势必会影响到y,这里x类型化数组的第一个元素赋值为7,那么在ArrayBuffer中即是00000000 00000000 00000000 00000111y是从第四个字节开始,也就是从00000111开始, 所以y也是00000111也就是7了。

类型化数组与常规数组的区别

类型化数组实质上是二进制数据,而ArrayBuffer这段区域又是指定长度的,基于这些便可推出其与常规数组的区别:

  • 类型化数组元素都是数字,它不像JS常规数组那样可以参杂不同类型,比如下面例子?中的赋值就是无效的

  • 类型化数组长度固定

  • 所有元素初始化为0

var  a = new Int8Array(3)
a[0] = 'hello'
a[0] // =>0 显示a[0]依然未定义
a[0] = '8'
a[0] // = > 8 但是注意类型的自动转换,当可被转换成数字时,JS会自动将其转成数值

DataView

既然本质是在操作二进制数据,那么就涉及到“高位优先(big-endian)”还是“低位优先(little-endian)”的数据传输问题,DataView的一整套API中就涉及到解决该问题,在当前的大部分CPU架构中的字节传输顺序都是使用低位优先,而在大部分的网络协议中使用的字节顺序却是高位优先(比如HTTP协议),它的一系列get方法中就可以设置字节的处理顺序。DataView也是一种视图,它的原理并不难,详细的dataview的API可以看前面提到的博客中的DataView章节。mark?ArrayBuffer:类型化数组

类型化数组的应用

二进制数据的接口主要应用于文件,在JS中涉及文件处理的API几乎都可以应用ArrayBuffer,主要是Ajax,File,Canvas。这几个例子等下再码,争取写出跟前面博客不一样的东西,先搬砖……

对类型化数组(Typed Array)与ArrayBuffer的理解 转囧囧的更多相关文章

  1. [HTML5] ArrayBuffer与类型化数组

    写在前面 这是关于JS二进制操作的第三篇博客,前两篇详见: [HTML5] Blob对象 [HTML5] FileReader对象 此前从宏观角度介绍了如何通过JS创建一个二进制对象,并介绍了如何将本 ...

  2. HTML5 ArrayBuffer:类型化数组 (二)

    类型化数组是JavaScript操作二进制数据的一个接口. 这要从WebGL项目的诞生说起,所谓WebGL,就是指浏览器与显卡之间的通信接口,为了满足JavaScript与显卡之间大量的.实时的数据交 ...

  3. ArrayBuffer:类型化数组

    类型化数组是JavaScript操作二进制数据的一个接口. 这要从WebGL项目的诞生说起,所谓WebGL,就是指浏览器与显卡之间的通信接口,为了满足JavaScript与显卡之间大量的.实时的数据交 ...

  4. Javascript高级编程学习笔记(95)—— WebGL(1) 类型化数组

    WebGL webgl 是针对 canvas 的 3D上下文,与其它Web技术不同,WebGL并非是W3C制定的标准,而是由 Khronos Group 制定的. 类型化数组 WebGL所涉及的复杂运 ...

  5. Scala 数组操作之Array、ArrayBuffer以及遍历数组

    ArrayBuffer 在Scala中,如果需要类似于Java中的ArrayList这种长度可变的集合类,则可以使用ArrayBuffer. // 如果不想每次都使用全限定名,则可以预先导入Array ...

  6. ES6躬行记(13)——类型化数组

    类型化数组(Typed Array)是一种处理二进制数据的特殊数组,它可像C语言那样直接操纵字节,不过得先用ArrayBuffer对象创建数组缓冲区(Array Buffer),再映射到指定格式的视图 ...

  7. JavaScript类型化数组(二进制数组)

    0.前言 对于前端程序员来说,平时很少和二进制数据打交道,所以基本上用不到ArrayBuffer,大家对它很陌生,但是在使用WebGL的时候,ArrayBuffer无处不在.浏览器通过WebGL和显卡 ...

  8. scala 学习(三)——Array和ArrayBuffer

    ArrayBuffer:类型化数组 首先需要注意的是Array是定长数组,而ArrayBuffer是可变数组.下面是一个小例子,对数据进行便利和修改的操作.

  9. Array与ArrayBuffer

    一.概述 二:Array使用 1.建立方式三种(数组里可以有不同的数据类型) 2.Array的简单使用 三:ArrayBuffer的简单使用 1.ArrayBuffer建立 导包 2.添加元素(+=) ...

随机推荐

  1. js获取时间查并实现倒计时读条

    <script type="text/javascript"> $().ready(function () {// 每增加一个切换,就要增加一行,tab1不变,其他的都 ...

  2. SQLServer 2017安装时的错误:Polybase要求安装Oracle JRE 7更新51或更高版本

    2016应该也有这个问题 下载JDK7就可以了(我装10是不可以解决的) 重新运行下 安装完后再安装SSMS 附: MS SQL SERVER 2017全套下载地址(含JDK7.SSMS.KEY): ...

  3. 利用nginx搭建https服务器

    一.HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块.服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加 ...

  4. orcad 里误给元件添加了属性,如何删除

    1.先尝试点击delete property 2.第一步不行就右键选择filters----->remove current filter进行删除

  5. 【已解决】WebUploader 0.1.5 安卓手机不能访问相机、IOS直接访问相机 的问题

    WebUploader 0.1.5 安卓手机不能访问相机.IOS直接访问相机 的问题 打开 webuploader.js if(navigator.userAgent.indexOf('Android ...

  6. Android的View 事件传递

    欢迎转载,请附出处: http://blog.csdn.net/as02446418/article/details/47422891 1.基础知识 (1) 全部 Touch 事件都被封装成了 Mot ...

  7. Xcode wifi连接真机调试

    设备环境:Mac OSX 10.12.5.iOS11.Xcode9 或以上版本 PS:这是WWDC2017的新功能,iOS11以上,Xcode9这是刚性要求.这个功能不好找,就记下来了 手机连接上Xc ...

  8. Harvard数据库课程CS 265: Research Topics in Database Systems

    CS 265: Research Topics in Database Systems Announcements Quiz 3 will be posted. Good luck! Quiz 2 h ...

  9. use-svn-cmd(Linux)

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,它采用了分支管理系统,是一个跨平台的软件,支持大多数常见的操作系统. svn命令行使用: 1.查看svn所支持的全部命令 $ svn ...

  10. 在Mac上为自己手动编译安装一套PHP7的开发环境

    首先你得去官网下载php7 beta1的版本 这里由于我是在mac上安装,所以就去下载linux相关的版本,地址也直接附上了php7 beta1windows版的官方也有发布详情猛戳:这里 解压安装包 ...