JS中类型化数组(Typed Arrays)详解和常见应用场景
在JavaScript中,类型化数组(Typed Arrays) 是用于处理二进制数据的对象。它们允许我们以一种高效的方式操作和存储大量的数值数据,特别适合处理类似于图像、音频、视频等场景的原始二进制数据。
类型化数组的基本概念
类型化数组并不是独立的数据结构,而是基于ArrayBuffer的视图。类型化数组包含以下两个核心部分:
-
ArrayBuffer:
- 一块通用的二进制数据缓冲区。
- 是类型化数组的基础,用来存储原始数据。
-
视图(View):
- 是一个具体的类型化数组,用来解释和操作
ArrayBuffer
中的二进制数据。 - 例如:
Int8Array
、Uint8Array
、Float32Array
等。
- 是一个具体的类型化数组,用来解释和操作
类型化数组的构造
类型 | 每个元素的字节数 | 数据范围 |
---|---|---|
Int8Array | 1 | -128 到 127 |
Uint8Array | 1 | 0 到 255 |
Uint8ClampedArray | 1 | 0 到 255,超出范围的值被截断 |
Int16Array | 2 | -32768 到 32767 |
Uint16Array | 2 | 0 到 65535 |
Int32Array | 4 | -2³¹ 到 2³¹-1 |
Uint32Array | 4 | 0 到 2³²-1 |
Float32Array | 4 | IEEE 754 单精度浮点数 |
Float64Array | 8 | IEEE 754 双精度浮点数 |
创建类型化数组
1. 使用构造函数直接创建
const int8 = new Int8Array(4); // 创建一个包含 4 个元素的 Int8Array,默认值为 0
console.log(int8); // Int8Array [0, 0, 0, 0]
2. 通过已有数组或可迭代对象创建
const uint8 = new Uint8Array([1, 2, 3, 255]);
console.log(uint8); // Uint8Array [1, 2, 3, 255]
3. 通过 ArrayBuffer 创建
const buffer = new ArrayBuffer(8); // 创建一个 8 字节的缓冲区
const view = new Int16Array(buffer);
view[0] = 42;
console.log(view); // Int16Array [42, 0, 0, 0]
4. 从另一个类型化数组创建
const float32 = new Float32Array([1.5, 2.5, 3.5]);
const int32 = new Int32Array(float32); // 截断浮点数为整数
console.log(int32); // Int32Array [1, 2, 3]
常见应用场景
1. 图像处理
// 创建一个 Uint8ClampedArray,常用于存储图像像素
const width = 2, height = 2;
const pixels = new Uint8ClampedArray(width * height * 4);// 设置像素数据 (R, G, B, A)
pixels[0] = 255; // Red
pixels[1] = 0; // Green
pixels[2] = 0; // Blue
pixels[3] = 255; // Alpha
console.log(pixels); // Uint8ClampedArray [255, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0]
2. 音频数据处理
// 假设我们有一个缓冲区存储的音频采样数据
const audioBuffer = new Float32Array([0.5, -0.5, 1.0, -1.0]);// 处理音频数据:简单的增益(音量放大)
for (let i = 0; i < audioBuffer.length; i++) {audioBuffer[i] *= 2;
}
console.log(audioBuffer); // Float32Array [1.0, -1.0, 2.0, -2.0]
3. WebGL 数据处理
WebGL 使用类型化数组存储顶点数据、颜色值等。
const vertices = new Float32Array([0.0, 0.5, 0.0, // 顶点1-0.5, -0.5, 0.0, // 顶点20.5, -0.5, 0.0, // 顶点3
]);
console.log(vertices); // Float32Array [0, 0.5, 0, -0.5, -0.5, 0, 0.5, -0.5, 0]
4. 文件读取和解析
const fileData = new Uint8Array([72, 101, 108, 108, 111]); // ASCII 对应 "Hello"// 解码为字符串
const decoder = new TextDecoder("utf-8");
console.log(decoder.decode(fileData)); // "Hello"
类型化数组的优势
-
高性能:
- 数据存储在连续的内存块中,访问和操作效率高。
-
便捷性:
- 提供多种内置方法如
set
、subarray
、slice
等操作数组。
- 提供多种内置方法如
-
与原生 API 的兼容性:
- 例如,与 WebGL、Web Audio、File API 等 API 配合使用。
注意事项
-
内存分配固定:
- 类型化数组一旦创建,其大小固定,不能动态扩展。
-
端序问题:
- 在跨平台数据传输时,需要注意字节序(Big-Endian 或 Little-Endian)。
-
与普通数组的区别:
- 类型化数组中的元素类型固定,不能混合存储多种数据类型。
总结
类型化数组是处理和操作二进制数据的强大工具,适用于性能敏感的应用场景,如图像处理、音频处理和 WebGL 开发。通过合理使用类型化数组,能够极大提高应用的效率和兼容性。
相关文章:
JS中类型化数组(Typed Arrays)详解和常见应用场景
在JavaScript中,类型化数组(Typed Arrays) 是用于处理二进制数据的对象。它们允许我们以一种高效的方式操作和存储大量的数值数据,特别适合处理类似于图像、音频、视频等场景的原始二进制数据。 类型化数组的基本概念 类型化数组…...

虚幻引擎是什么?
Unreal Engine,是一款由Epic Games开发的游戏引擎。该引擎主要是为了开发第一人称射击游戏而设计,但现在已经被成功地应用于开发模拟游戏、恐怖游戏、角色扮演游戏等多种不同类型的游戏。虚幻引擎除了被用于开发游戏,现在也用于电影的虚拟制片…...

LabVIEW生物医学信号虚拟实验平台
介绍了一款基于LabVIEW的多功能生物医学信号处理实验平台的设计和实现。平台通过实践活动加强学生对理论的理解和应用能力,特别是在心电图(ECG)和脑电图(EEG)的信号处理方面。实验平台包括信号的滤波、特征提取和频谱分析等功能,能直观体验和掌握生物医学…...

【软件工程】十万字知识点梳理 | 期末复习专用
原创文章,禁止转载。 文章目录 图CRC卡片用例图类图状态图活动图泳道图软件质量因素自顶向下集成自底向上集成人员与工作量之间的关系时序图关键路径软件结构基本路径测试判定表数据流图(DFD)体系结构设计问题数据字典挣值分析等价划分程序流程图PAD | N-S燃尽图甘特图对象模…...
Android --- 在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?
1.RemoteCallbackList vs ArrayList RemoteCallbackList 是一个特殊的 List,它用来管理跨进程的回调,特别是当回调对象是在不同进程中时。它在 AIDL(Android Interface Definition Language)通信中常常用来处理跨进程的通信。 Arr…...

ADC(二):外部触发
有关ADC的基础知识请参考标准库入门教程 ADC(二):外部触发 1、TIM1的CC1事件触发ADC1DMA重装载2、TIM3的TRGO事件(的更新事件)触发ADC1DMA重装载3、TIM3的TRGO事件(的捕获事件)触发ADC1DMA重装载4、优化TIM3的TRGO事件(的捕获事件)触发ADC1D…...

数仓开发那些事(8)
程序员圣经 为什么刚刚能运行,现在就不行 为什么刚刚不运行,现在就可以 为什么他的可以跑,我的不能跑 为什么我的可以跑,他的就不行 为什么这台电脑能,那台就不行 为什么这台电脑不行,那台就行 神州员工&a…...

【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…...

【连续学习之ResCL算法】2020年AAAI会议论文:Residual continual learning
1 介绍 年份:2020 会议: AAAI Lee J, Joo D, Hong H G, et al. Residual continual learning[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2020, 34(04): 4553-4560. 本文提出的算法是Residual Continual Learning (ResC…...
【zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程
系列文章目录 【zookeeper核心源码解析】第一课:zk启动类核心流程序列图 【zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程 【zookeeper核心源码解析】第三课:leader与follower何时开始同步&#…...

数据流图和流程图的区别
在结构化建模中,数据流图和流程图都是非常重要的工具,它们为开发人员提供了强大的手段来分析和设计系统。尽管两者在表面上看起来有些相似,但它们在功能、用途和表达方式上存在显著的区别。本文将详细探讨数据流图和流程图的区别,…...

关于内网服务器依托可上网电脑实现访问互联网
关于内网服务器依托可上网电脑实现访问互联网 背景:在实验室内网的一个服务器,没有配置 NAT ,无法使用外网,只能在局域网内进行访问,但是呢,我们自己的电脑是可以访问互联网的,那么怎么通过让自…...

期权懂|期权入门知识:如何选择期权合约?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 期权入门知识:如何选择期权合约? 一、选择月份: 通常情况下,月份的选择与期货合约的选择类似,主要关注主力合约。主力…...

如何用gpt来分析链接里面的内容(比如分析论文链接)和分析包含多个文件中的一块代码
如何用gpt来分析链接里面的内容,方法如下 这里使用gpt4里面有一个网路的功能 点击搜索框下面这个地球的形状即可启动搜索网页模式 然后即可提出问题在搜索框里:发现正确识别和分析了链接里面的内容 链接如下:https://arxiv.org/pdf/2009.1…...

Bash 脚本教程
注:本文为 “Bash 脚本编写” 相关文章合辑。 BASH 脚本编写教程 as good as well于 2017-08-04 22:04:28 发布 这里有个老 American 写的 BASH 脚本编写教程,非常不错,至少没接触过 BASH 的也能看懂! 建立一个脚本 Linux 中有…...
Pinia最简单使用(vite+vue3)
文章目录 创建项目安装Pinia包main.js注册Pinia在src下创建store/store.js文件,放入以下内容在app.vue中的使用(在其他组件也一样的) 创建项目 npm create vitelatest my-vue-app选vue 选JavaScript cd my-vue-app npm install npm run dev安装Pinia包 npm install piniamain…...

计算机网络——期末复习(4)协议或技术汇总、思维导图
思维导图 协议与技术 物理层通信协议:曼彻斯特编码链路层通信协议:CSMA/CD (1)停止-等待协议(属于自动请求重传ARQ协议):确认、否认、重传、超时重传、 (2)回退N帧协…...

Microsoft word@【标题样式】应用不生效(主要表现为在导航窗格不显示)
背景 随笔。Microsoft word 2013基础使用,仅做参考和积累。 问题 Microsoft word 2013,对段落标题文字应用【标题样式】不生效(主要表现为在导航窗格不显示)。 图1 图2 观察图1和图2,发现图1的文字在应用【标题一】样…...

轮播图带详情插件、uniApp插件
超级好用的轮播图 介绍访问地址参数介绍使用方法(简单使用,参数结构点击链接查看详情)图片展示 介绍 带有底部物品介绍以及价格的轮播图组件,持续维护,uniApp插件,直接下载填充数据就可以在项目里面使用 …...

云计算时代携程的网络架构变迁
大家觉得有意义和帮助记得及时关注和点赞!!! 前言0 携程云平台简介 网络演进时间线1 基于 VLAN 的二层网络 1.1 需求1.2 解决方案:OpenStack Provider Network 模型1.3 硬件网络拓扑1.4 宿主机内部网络拓扑1.5 小结 优点缺点2 基于 SDN 的大二层网络 2.1 面临的新问…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...