从0开始学习JavaScript--深入探究JavaScript类型化数组

JavaScript类型化数组是一种特殊的数组类型,引入了对二进制数据的更底层的操作。这种数组提供了对内存中的二进制数据直接进行读写的能力,为处理图形、音频、视频等大规模数据提供了高效的手段。本文将深入探讨JavaScript类型化数组的基本概念、常见类型、操作方法以及实际应用,通过丰富的示例代码,帮助大家更全面地理解和应用这一强大的特性。

1.基本概念

JavaScript类型化数组是一种特殊的数组对象,用于处理二进制数据。它通过使用底层的ArrayBuffer对象来分配内存,并通过视图(TypedArray)来解释这些内存。常见的TypedArray类型包括Int8ArrayUint8ArrayInt16ArrayUint16Array等,每种类型占据不同的字节长度。

// 示例:创建和使用TypedArray
let buffer = new ArrayBuffer(8); // 分配一个包含8字节的内存
let intArray = new Int32Array(buffer); // 使用Int32Array视图解释这段内存intArray[0] = 42;
console.log(intArray[0]); // 输出:42

在这个例子中,首先创建了一个包含8字节内存的ArrayBuffer,然后通过Int32Array视图来解释这段内存,并将值42存储在该内存中。

2. TypedArray 类型

TypedArray 提供了多种不同的数据类型,每种类型都有其特定的用途。以下是一些常见的TypedArray类型:

  • Int8ArrayUint8Array:8位有符号和无符号整数数组
  • Int16ArrayUint16Array:16位有符号和无符号整数数组
  • Int32ArrayUint32Array:32位有符号和无符号整数数组
  • Float32Array:32位浮点数数组
  • Float64Array:64位浮点数数组
// 示例:不同类型的TypedArray
let intArray = new Int32Array(4); // 32位整数数组
let floatArray = new Float32Array(4); // 32位浮点数数组intArray[0] = 42;
floatArray[0] = 3.14;console.log(intArray[0]); // 输出:42
console.log(floatArray[0]); // 输出:3.14

在这个例子中,创建了一个32位整数数组和一个32位浮点数数组,分别存储了整数和浮点数。

3. 操作和方法

TypedArray提供了丰富的方法来进行数据操作,包括读写、复制、切片等操作。以下是一些常见的方法:

读写操作:通过索引直接读写TypedArray中的元素。

let intArray = new Int32Array(4);
intArray[0] = 42;
console.log(intArray[0]); // 输出:42

复制和切片:使用.slice()方法创建TypedArray的子集,或者通过.set()方法复制另一个TypedArray的值。

let sourceArray = new Int32Array([1, 2, 3, 4]);
let subArray = sourceArray.slice(1, 3); // 切片,包含索引1和2的元素
let targetArray = new Int32Array(2);
targetArray.set(subArray); // 复制sourceArray的部分到targetArrayconsole.log(subArray); // 输出:[2, 3]
console.log(targetArray); // 输出:[2, 3]

迭代:使用for...of语句遍历TypedArray中的元素。

let intArray = new Int32Array([1, 2, 3, 4]);for (let value of intArray) {console.log(value); // 依次输出:1, 2, 3, 4
}

数组转换:可以通过Array.from()将TypedArray转换为普通数组。

let intArray = new Int32Array([1, 2, 3, 4]);
let normalArray = Array.from(intArray);console.log(normalArray); // 输出:[1, 2, 3, 4]

4. 实际应用场景

TypedArray在处理大规模二进制数据时特别有用,例如在图像处理、音频处理、网络传输等领域。以下是一个简单的例子,演示了如何使用TypedArray进行图像处理:

// 示例:使用TypedArray进行图像处理
let canvas = document.createElement("canvas");
let ctx = canvas.getContext("2d");// 画一张图像
ctx.fillStyle = "red";
ctx.fillRect(0, 0, 2, 2);// 获取图像数据
let imageData = ctx.getImageData(0, 0, 2, 2);
let pixelArray = new Uint8Array(imageData.data);// 将红色改为蓝色
for (let i = 0; i < pixelArray.length; i += 4) {// RGBA格式,每个像素4个字节,依次是红、绿、蓝、透明度pixelArray[i + 2] = 255; // 将红色通道的值设为255,即变为蓝色
}// 将修改后的数据写回图像
ctx.putImageData(new ImageData(pixelArray, 2, 2), 0, 0);

在这个例子中,通过canvas绘制了一个2x2的红色矩形,然后使用TypedArray获取了图像的像素数据,并将红色通道的值改为255,即将红色改为蓝色,最后将修改后的数据写回图像。

总结

JavaScript类型化数组为处理二进制数据提供了强大的工具,本文深入探讨了其基本概念、常见类型和基本操作,并进一步介绍了共享内存、大端小端字节序以及类型化数组与普通数组之间的转换等高级特性。

通过共享内存的方式,不同的TypedArray能够在不拷贝数据的情况下互相影响,为高效的数据处理提供了可能。了解大端小端字节序则为处理多字节数据在不同平台下的正确解释提供了保障,使得数据交互更加可靠。

此外,类型化数组与普通数组之间的转换方法使得在不同数据结构之间灵活转换成为可能,为开发者提供了更为便捷的操作方式。

在实际应用中,JavaScript类型化数组广泛用于图像处理、音频处理、网络通信等场景,通过示例代码,可以更好地理解和应用这一特性。

随着Web平台的发展,JavaScript类型化数组在处理大规模二进制数据方面的应用前景十分广阔。读者可以通过深入研究这些高级特性,进一步提升在数据处理领域的效率和性能,为未来的Web开发做好准备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/199477.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的socket模块以及通信相关学习笔记

Socket又称"套接字"&#xff0c;应用程序通常通过"套接字"向网络发出请求或者应答网络请求&#xff0c;使主机间或者一台计算机上的进程间可以通讯(最初设计是为了是使同一台计算机中的不同进程进行信息传递通信)&#xff0c;最后拓展到可以使网络上两台计…

数据分析基础之《jupyter notebook工具》

一、安装库 1、linux库 yum install python3-devel 2、python库 pip3 install -U matplotlib pip3 install -U numpy pip3 install -U pandas pip3 install -U TA-Lib pip3 install -U tables pip3 install -U notebook 3、如果TA-Lib安装不上&#xff0c;先手动安装依赖库 …

利用 Pandoc + ChatGPT 优雅地润色论文,并保持 Word 公式格式:Pandoc将Word和LaTeX文件互相转化

论文润色完美解决方案&#xff1a;Pandoc 与 ChatGPT 的强强联合 写在最前面其他说明 一、通过 Pandoc 将 Word 转换为 LaTeX 的完整指南步骤 1: 安装 PandocWindows:macOS:Linux: 步骤 2: 准备 Word 文档步骤 3: 转换文档步骤 4: 检查并调整输出步骤 5: 编译 LaTeX 文档总结 二…

分发糖果(贪心算法)

题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回…

requests爬虫IP连接初始化问题及解决方案

问题背景 在使用HTTPS爬虫IP连接时&#xff0c;如果第一次请求是chunked方式&#xff0c;那么HTTPS爬虫IP连接将不会被初始化。这个问题可能会导致403错误&#xff0c;或者在使用HTTPS爬虫IP时出现SSL错误。 解决方案 为了解决这个问题&#xff0c;我们可以在requests库的ada…

element ui修改select选择框背景色和边框色

一、修改时间输入框的背景和边框字体颜色 <div class"hright"><el-date-picker :popper-append-to-body"false" class"custom-timeselect" v-model"form.timevalue" type"daterange" range-separator"至"…

spring boot加mybatis puls实现,在新增/修改时,对某些字段进行处理,使用的@TableField()

1.先说场景&#xff0c;在对mysql数据库表数据插入或者更新时都得记录时间和用户id 传统实现有点繁琐&#xff0c;这里还可以封装一下公共方法。 2.解决方法&#xff1a; 2.1&#xff1a;使用aop切面编程&#xff08;记录一下&#xff0c;有时间再攻克&#xff09;。 2.2&…

《云计算:云端协同,智慧互联》

《云计算&#xff1a;云端协同&#xff0c;智慧互联》 云计算&#xff0c;这个科技领域中的热门词汇&#xff0c;正在逐渐改变我们的生活方式。它像一座座无形的桥梁&#xff0c;将世界各地的设备、数据、应用紧密连接在一起&#xff0c;实现了云端协同&#xff0c;智慧互联的愿…

PHPmail 发送邮件错误 550 的原因是什么?

电子邮件错误消息链接到简单邮件传输协议 (SMTP)&#xff0c;这是一组发送和接收电子邮件的标准化规则。因此&#xff0c;它也称为 SMTP 550 错误代码。在某些情况下&#xff0c;电子邮件错误 550 是由收件人一方的问题引起的。 以下是电子邮件错误 550 的一些可能原因&#x…

Nosql之redis概述及基本操作

关系数据库与非关系型数据库概述 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言&#xff0c;用于执行对关系型…

48. 旋转图像

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&…

键盘方向键移动当前选中的table单元格,并可以输入内容

有类似于这样的表格&#xff0c;用的<table>标签。原本要在单元格的文本框里面输入内容&#xff0c;需要用鼠标一个一个去点以获取焦点&#xff0c;现在需要不用鼠标选中&#xff0c;直接用键盘的上下左右来移动当前正在输入的单元格文本框。 const currentCell React.u…

STM32硬件调试器不一定准确,proteus不一定准确

我在做实验的过程中&#xff0c;发现里面的那个变量ii一直都不变搞了很久没有发现问题&#xff0c; 然后怀疑是不是软件出了问题&#xff0c;然后直接只用单片机的一个灯泡来检测是否正常&#xff0c;发现&#xff1a;单片机里面正常&#xff0c;但是硬件调试的时候&#xff0…

数据结构--字符串的模式匹配

案例导入概念 朴素&#xff08;暴力&#xff09;模式匹配算法 定位操作&#xff1a; 计算时间复杂度 总结

redis-持久化

目录 一、RDB RDB触发保存的两种方式 优劣势总结 二、AOF AOF持久化流程&#xff1a; 1、开启AOP 2、异常恢复 3、AOF的同步频率设置 4、ReWrite压缩 5、优劣势总结 Redis 4.0 混合持久化 redis是内存数据库&#xff0c;所有的数据都会默认存在内存中&#xff0c;如…

【代数学习题3】从零理解数域扩张与嵌入 —— 同构、商环、分裂域与同态映射

数域的结构——数域的扩张、嵌入 写在最前面从零开始的概念合集从零理解数域的扩张和同构概念基本概念同构的概念商环的概念 2 3 \sqrt[3]{2} 32 ​ 有三个 Q \mathbb{Q} Q-嵌入&#xff08;同态映射&#xff09; Q ( 2 3 ) \mathbb{Q}(\sqrt[3]{2}) Q(32 ​) 和 Q [ x ] / (…

【练习】检测U盘并自动复制内容到电脑的软件

软件作用&#xff1a; 有U盘插在电脑上后&#xff0c;程序会检测到U盘的路径。 自己可以提前设置一个保存复制文件的路径或者使用为默认保存的复制路径&#xff08;默认为桌面&#xff0c;可自行修改&#xff09;。 检测到U盘后程序就会把U盘的文件复制到电脑对应的…

集群搭建(redis7)

一、主从复制(replica)&#xff08;不推荐&#xff09; 介绍 主从复制 mmaster以写为主&#xff0c;slave以读为主当master数据变化时&#xff0c;自动将新的数据异步同步到其他slave数据库 读写分离down机恢复数据备份水平扩容支撑高并发 基本操作 配从不配主 权限细节 maste…

JVS低代码表单设计:数据联动详解(多级数据级、数据回显等)

在这信息化时代&#xff0c;表单作为数据的收集和展示工具&#xff0c;已经渗透到不同的角落。JVS低代码对表单的设计和操作进行了不断的优化和创新。其中&#xff0c;联动回显作为一项重要的功能&#xff0c;无论是多级数据级联控制、组件的联动控制&#xff0c;还是多表的数据…

通信网络安全防护定级备案流程介绍(附流程图)

通信网络安全防护定级备案是拥有增值电信业务经营许可证并且有开展电信业务的企业要做的一件事情。刚接触这块的家人们在填报操作的时候可能对具体通信网络安全防护定级备案流程还不是很清楚&#xff0c;所以就给大家画张具体的流程图吧&#xff0c;可以更加直观的了解。 通信…