ES6 入门系列 ArrayBuffer
由来
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的更多相关文章
- ES6入门系列三(特性总览下)
0.导言 最近从coffee切换到js,代码量一下子变大了不少,也多了些许陌生感.为了在JS代码中,更合理的使用ES6的新特性,特在此对ES6的特性做一个简单的总览. 1.模块(Module) --C ...
- ES6 入门系列 (一)ES6的前世今生
要学好javascript , ECMAScript标准比什么都强, ESMAScript标准已经用最严谨的语言和最完美的角度展现了语言的实质和特性. 理解语言的本质后,你已经从沙堆里挑出了珍珠,能经 ...
- ES6入门系列四(测试题分析)
0.导言 ES6中新增了不少的新特性,来点测试题热热身.具体题目来源请看:http://perfectionkills.com/javascript-quiz-es6/. 以下将一题一题来解析what ...
- ES6入门系列一(基础)
1.let命令 Tips: 块级作用域(只在当前块中有效) 不会变量提升(必须先申明在使用) 让变量独占该块,不再受外部影响 不允许重复声明 总之:let更像我们熟知的静态语言的的变量声明指令 ES6 ...
- ES6 入门系列 - 函数的扩展
1函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log( ...
- ES6 入门系列 - let 和 const 命令
let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = ; ; } a // ReferenceEr ...
- ES6入门系列二(数值的扩展)
ES6 在 Number对象上新增了很多方法 1 . Number.isFinite()判断是否为有限的数字 和全局的isFinite() 方法的区别是 isFinite('1') === tr ...
- ES6入门系列 ----- Reflect
Reflect 是ES6 为了操作对象而提供的新的API, 目的是: 将Object 上一些明显属于语言内部的方法,比如 Object.defineProperty 放到 Reflect对象上 ...
- ES6入门系列 ----- 对象的遍历
工作中遍历对象是家常便饭了,遍历数组的方法五花八门, 然而很多小伙伴是不是和我之前一样只会用for ...in.... 来遍历对象呢, 今天给大家介绍五种遍历对象属性的方法: 1, 最常用的for ...
随机推荐
- 邮Z速递物流,让用户密码在网络中遨游
" 最近分析快递行业的APP上瘾了,求解救." 邮政作为快递行业一个傻大黑的存在,一直很奇怪,我一直在纳闷,邮政和EMS到底是不是一家,在很多网点,它们是一体的存在,但很多东西,又 ...
- Toast实现源码解析
说明 本篇文章用于介绍Android中Toast的实现原理.和简单实现一个自定义的Toast. Toast实现 一般常用Toast格式为: Toast.makeText(context,"t ...
- Java并发编程艺术读书笔记
1.多线程在CPU切换过程中,由于需要保存线程之前状态和加载新线程状态,成为上下文切换,上下文切换会造成消耗系统内存.所以,可合理控制线程数量. 如何控制: (1)使用ps -ef|grep appn ...
- linux远程Windows服务器
Rdesktop -f ip 端口 Ctrl+alt+enter退出全屏
- 将Docker容器转移至另一服务器
1 把当前的容器提交为一个镜像: docker commit 容器名 镜像名 2 将镜像存为tar文件 docker save 镜像名 >备份文件.tar 3将 备份文件.tar 复制到目的主机 ...
- MATLAB常见的学习率下降策略
MATLAB常见的学习率下降策略 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 几种常见的学习率下降策略(learning rate decay st ...
- Pwnable-fd
打开Ubuntu输入ssh fd@pwnable.kr -p2222,连接之后输入密码guest 之后就是ls -l看看里面的文件和权限,fd.fd.c.flag 看看fd.c的源码 #include ...
- 深度工作(Charlotte)
作者:Charlotte文章转自:https://zhuanlan.zhihu.com/p/56719363 为什么要深度工作? 作为一名程序员/媛,工作时长动则十几小时,然而有的人效率奇高,有的人上 ...
- luoguP2463 [SDOI2008]Sandy的卡片
题意 显然加上一个数相等就是差分数组相等,于是问题变为求几个串的最长公共子串. 这里我学习了如何用SA求LCS. 首先问题要转化成求一些后缀的最长公共前缀,要求这些后缀分属不同的串. 于是二分答案,于 ...
- luoguP4069 [SDOI2016]游戏
题意 显然书剖套李超树. 考虑怎么算函数值: 设\((x,y)\)的\(lca\)为\(z\),我们插一条斜率为\(k\),截距为\(b\)的线段. \((x,z)\)上的点\(u\): \(f(u) ...