由来

推荐在这里阅读

js操作二进制数据三兄弟

ArrayBuffer对象, TypeArray视图和DataView视图


它们都以数组的语法处理二进制数据,所以统称为二进制数组


::: tip

二进制数组并不是真正的数组,而是类似数组的对象

:::

设计的目的

与WebGL项目有关,WebGL是浏览器和显卡之间的通信接口,


利用二进制数据通信可以大大提升脚本性能

概念

  • ArrayBuffer: 原始的二进制数据
  • TypeArray: 用于读写简单类型的二进制数据
  • DataView: 用于读写复杂类型的二进制数据
  • TypeArray支持的数据类型
数据类型 字节长度 含义
Int8 1 8 位带符号整数
Uint8 1 8 位不带符号整数
Uint8C 1 8 位不带符号整数(自动过滤溢出)
Int16 2 16 位带符号整数
Uint16 2 16 位不带符号整数
Int32 4 32 位带符号整数
Uint32 4 32 位不带符号的整数
Float32 4 32 位浮点数数
Float64 8 64 位浮点数(自动过滤溢出)

用途

在浏览器中

以下几个AIP用到了二进制数组操作二进制数据

  • File API

    • fileReader可以使用readAsArrayBuffer(file)读取文件
  • XMLHttpRequest

    • ajax的返回值可以是ArrayBuffer对象
  • Fetch API

    • fetch取回的数据就是ArrayBuffer对象
  • Canvas

      const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
    const uint8ClampedArray = imageData.data;
    • 上面取到的是 一种针对canvas元素的专有类型Unit8ClampedArray。
    • 这个视图类型专门针对颜色,把每个字节解读为无符号8位整数,只能取值0 - 255
  • WebSockets

    • 通过ArrayBuffer 发送或者接收二进制数据
    let socket = new WebSocket('ws://127.0.0.1:8081');
    socket.binaryType = 'arraybuffer';
    // Wait until socket is open
    socket.addEventListener('open', function (event) {
    // Send binary data
    const typedArray = new Uint8Array(4);
    socket.send(typedArray.buffer);
    });
    // Receive binary data
    socket.addEventListener('message', function (event) {
    const arrayBuffer = event.data;
    // ···
    });

ArrayBuffer 的api

/**
* 生成了一段32字节的内存区域,
* 每个字节的默认值都是0
* 不能直接读写
* 只能通过视图读写
* @type {ArrayBuffer}
*/
const arrbuffer = new ArrayBuffer(32)

返回所分配的内存区域的字节长度

ArrayBuffer.prototype.byteLength

允许将内存区域的一部分复制生成一个新的ArrayBuffer对象

ArrayBuffer.prototype.slice()

用DataView视图读取

/**
* 为ArrayBuffer创建视图
* 以便读取
* @type {DataView}
*/
const dataView = new DataView(arrbuffer) /**
* 以无符号8位整数格式读取第一个元素
*/
dataView.getUint8(0) // 0

用TypeArray视图读取


上表中每一种数据类型对应一个构造函数

返回整段内存区域对应的ArrayBuffer对象,只读

TypeArray.prototype.buffer

返回TypeArray数组占据的内存长度,单位位字节, 只读

TypeArray.prototype.byteLength

用于整段的复制,复制a的内容到b

// TypeArray.prototype.set()
const a = new Uint8Array(8);
const b = new Uint8Array(8);
b.set(a);

:::tip

普通数组的操作方法和属性对TypeArray 数组完全适用

:::

ES6 入门系列 ArrayBuffer的更多相关文章

  1. ES6入门系列三(特性总览下)

    0.导言 最近从coffee切换到js,代码量一下子变大了不少,也多了些许陌生感.为了在JS代码中,更合理的使用ES6的新特性,特在此对ES6的特性做一个简单的总览. 1.模块(Module) --C ...

  2. ES6 入门系列 (一)ES6的前世今生

    要学好javascript , ECMAScript标准比什么都强, ESMAScript标准已经用最严谨的语言和最完美的角度展现了语言的实质和特性. 理解语言的本质后,你已经从沙堆里挑出了珍珠,能经 ...

  3. ES6入门系列四(测试题分析)

    0.导言 ES6中新增了不少的新特性,来点测试题热热身.具体题目来源请看:http://perfectionkills.com/javascript-quiz-es6/. 以下将一题一题来解析what ...

  4. ES6入门系列一(基础)

    1.let命令 Tips: 块级作用域(只在当前块中有效) 不会变量提升(必须先申明在使用) 让变量独占该块,不再受外部影响 不允许重复声明 总之:let更像我们熟知的静态语言的的变量声明指令 ES6 ...

  5. ES6 入门系列 - 函数的扩展

    1函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log( ...

  6. ES6 入门系列 - let 和 const 命令

    let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = ; ; } a // ReferenceEr ...

  7. ES6入门系列二(数值的扩展)

    ES6 在 Number对象上新增了很多方法 1 .    Number.isFinite()判断是否为有限的数字 和全局的isFinite() 方法的区别是 isFinite('1') === tr ...

  8. ES6入门系列 ----- Reflect

    Reflect   是ES6 为了操作对象而提供的新的API, 目的是: 将Object 上一些明显属于语言内部的方法,比如 Object.defineProperty  放到 Reflect对象上 ...

  9. ES6入门系列 ----- 对象的遍历

    工作中遍历对象是家常便饭了,遍历数组的方法五花八门, 然而很多小伙伴是不是和我之前一样只会用for ...in.... 来遍历对象呢, 今天给大家介绍五种遍历对象属性的方法: 1, 最常用的for  ...

随机推荐

  1. VectorMap.js 矢量地图库 – 快速入门

    VectorMap.js是一个开源地图渲染JavaScript库, 可以使用WebGL或者HTML5两种方式进行交互式矢量地图 (包括“矢量瓦片地图”,一般性矢量数据地图)和 栅格瓦片地图的渲染. W ...

  2. Python类定义、属性、初始化和析构

    类的定义,属性和方法概念 方法中self的作用和意义 初始化( __init__ ) 和 析构方法( __del__ ) 类的定义 class 类名 实例 实例名 = 类名() 一个“实例”的“特征” ...

  3. 4. Go语言—值类型和引用类型

    一.值类型 1. 定义 ​ 变量直接存储的值,内存通常在栈中分配: var i = 5 -> i-->5 2. 应用 int.float.bool.string.数组.struct 二.引 ...

  4. c# 第33节 类的封装--访问修饰符

    本节内容: 1:封装的简介 2:封装怎么实现 3:访问修饰符 1:封装的简介 2:封装怎么实现 3:访问修饰符 4:访问修饰符注意点

  5. 【第4题】 什么是https

    https是基于http和SSL/TLS实现的一个协议,他可以保证在网络上传输的数据都是加密的,从而保证数据安全. 接下来我们从http协议开始,提出想法并逐步进行分析,最终实现Https. 1. h ...

  6. 关于appium的简单理解

    搭建好appium环境后,要学会定位app页面上的元素.下面是2款元素定位工具 uiautomatorviewer   -- Android SDK自带的元素定位工具,由Google开发的 Inspe ...

  7. 使用Appium进行微信公众号自动化测试

    查看Android的webview视图版本:手机链接电脑后在电脑Chrome打开页面chrome://inspect/#devices查看Android的Chrome内核版本     下载与该版本相对 ...

  8. Java进阶的道路,怎么成为大牛?

    已然励志在java路上走的更远,那就有必要了解java的途径.先看图 image.png 愈加细化的细节如下​ 一: 编程基础 不管是C仍是C++,不管是Java仍是PHP,想成为一名合格的程序员,根 ...

  9. 题解 P2719 【搞笑世界杯】

    其实懂了之后很简单,但是刚开始真的很难想.. d[a][b]表示剩a张A类票和b张B类票时,最后两张票相同的概率 那么此时的排队的第一个人只有两种选择 拿A类票或者B类票 抛硬币得到的可能性当然是二分 ...

  10. Win10 企业版ltsc 无法访问samba网络共享问题及解决!(转)

    1.本地安全策略,本地策略-安全选项,需要修改成默认的值的修改方式:查找注册表浏览到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA直接 ...