从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.mzph.cn/news/153075.shtml

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

相关文章

场景交互与场景漫游-对象选取(8-2)

对象选取示例的代码如程序清单8-11所示&#xff1a; /******************************************* 对象选取示例 *************************************/ // 对象选取事件处理器 class PickHandler :public osgGA::GUIEventHandler { public:PickHandler() :_mx(0.0f), _my…

48. 旋转图像

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

用平板当电脑副屏(spacedesk)双端分享

文章目录 1.准备工作2.操作流程1. 打开spacedesk点击2. 勾选USB Cable Android3. 用数据线连接移动端和pc端&#xff0c;选择仅充电4. 打开安装好的spacedesk 记得在win系统中设置扩展显示器&#xff1a; 1.准备工作 下载软件spacedesk Driver Console pc端&#xff1a; 移动…

macos苹果电脑清理软件有哪些?cleanmymac和腾讯柠檬哪个好

MacOS是一款优秀的操作系统&#xff0c;但是随着使用时间的增加&#xff0c;它也会产生一些不必要的垃圾文件&#xff0c;占用磁盘空间和内存资源&#xff0c;影响系统的性能和稳定性。为了保持MacOS的清洁和高效&#xff0c;我们需要使用一些专业的清理软件来定期扫描和清除这…

Pandas数据集的合并与连接merge()方法_Python数据分析与可视化

数据集的合并与连接 merge()解析merge()的主要参数 merge()解析 merge()可根据一个或者多个键将不同的DataFrame连接在一起&#xff0c;类似于SQL数据库中的合并操作。 数据连接的类型 一对一的连接&#xff1a; df1 pd.DataFrame({employee: [Bob, Jake, Lisa, Sue], grou…

【Linux】:体系结构与进程概念

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux体系结构和进程的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入…

腾讯云轻量数据库1核1G性能测评、租用费用和详细介绍

腾讯云轻量数据库服务采用腾讯云自研的新一代云原生数据库 TDSQL-C&#xff0c;融合了传统数据库、云计算与新硬件技术的优势&#xff0c;100%兼容 MySQL&#xff0c;实现超百万级 QPS 的高吞吐&#xff0c;128TB 海量分布式智能存储&#xff0c;保障数据安全可靠。腾讯云百科t…

机器人制作开源方案 | 智能照科植物花架

作者&#xff1a;付菲菲、于海鑫、王子敏单位&#xff1a;黑河学院指导老师&#xff1a;索向峰、李岩 1. 概述 1.1设计背景​ 随着时代的发展&#xff0c;城市化脚步加快、城市人口密度越来越大、城市生活节奏快压力大作息难成规律。城市建筑建筑面积迅速增加、而绿…

Leetcode—5.最长回文子串【中等】

2023每日刷题&#xff08;三十五&#xff09; Leetcode—5.最长回文子串 中心扩展法算法思想 可以使用一种叫作“中心扩展法”的算法。由回文的性质可以知道&#xff0c;回文一定有一个中心点&#xff0c;从中心点向左和向右所形成的字符序列是一样的&#xff0c;并且如果字符…

Vue移动 HTML 元素到指定位置 teleport 标签

teleport 标签&#xff1a;用于将组件中的 HTML 元素移动到任意的位置。 使用 teleport 标签移动 HTML 元素&#xff1a; <!-- 将 teleport 中的内容移动到 body 标签中 --> <teleport to"body"><div><h3>我是第三层组件的标题</h3>…

如何使用http来获取thingsbord中的设备数据

背景 有个读者问我,他想做tb的二次开发,想要通过一个接口来查询设备的遥测数据。 于是我给他写了这篇文章。 具体实现 由于他使用的是cloud版本,于是我使用cloud来做演示 文档的接口 https://thingsboard.cloud/swagger-ui/#/telemetry-controller/getTimeseriesUsing…

V100 GPU服务器安装CUDA教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Linux C 线程间同步机制

线程间同步机制 概述保护机制互斥锁创建互斥锁  pthread_mutex_init加锁  pthread_mutex_lock解锁  pthread_mutex_unlock删除锁  pthread_mutex_destroy 条件变量创建条件变量  pthread_cond_init激活条件变量  pthread_cond_signal等待条件变量  pthread_cond_…

python实现炫酷的屏幕保护程序

shigen日更文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 上次的文章如何实现一个下班倒计时程序的阅读量很高&#xff0c;觉得也很实用酷炫&#xff0c;下边是昨天的体验…

QT5 MSVC2017 64bit配置OpenCV4.5无需编译与示范程序

环境&#xff1a;Windows 10 64位 Opencv版本&#xff1a;4.5 QT&#xff1a;5.14 QT5 MSVC2017配置OpenCV 版本参考&#xff1a; opencv msvc c对应版本 1.安装MSVC2017&#xff08;vs2017&#xff09; 打开Visual Studio Installer&#xff0c;点击修改 选择vs2017生成工…

java使用 TCP 的 Socket API 实现客户端服务器通信

一&#xff1a;什么是 Socket(套接字) Socket 套接字是由系统提供于网络通信的技术, 是基于 TCP/IP 协议的网络通信的基本操作&#xff0c;要进行网络通信, 需要有一个 socket 对象, 一个 socket 对象对应着一个 socket 文件, 这个文件在 网卡上而不是硬盘上, 所以有了 sokcet…

3D应用开发引擎HOOPS如何促进AEC数字化架构革新?

随着科技的不断发展&#xff0c;建筑、工程和施工&#xff08;AEC&#xff09;行业正在掀起令人瞩目的数字化转型浪潮。在这一变革的过程中&#xff0c;Tech Soft 3D的HOOPS SDK&#xff08;软件开发工具包&#xff09;正扮演着关键的角色&#xff0c;为构建世界一流的AEC和BIM…

【CVE-2023-4357】Chrome-XXE 任意文件读取漏洞复现及原理解析

官方文档 https://bugs.chromium.org/p/chromium/issues/detail?id1458911 漏洞描述 Short description: Libxslt is the default XSL library used in WebKit based browsers such as chrome, safari etc. Libxslt allows external entities inside documents that are lo…

UML统一建模语言

UML包含3种构造块&#xff1a;事物、关系、图。 事物&#xff1a;模型中代表性成分的抽象关系&#xff1a;把事物结合在一起图&#xff1a;聚集了相关的事物 事物 结构事务&#xff1a;模型的静态部分&#xff0c;包括类、接口、协作、用例、主动类、构件、制品、结点 行为事…

Shell判断:模式匹配:case(一)

一、前言 shell编程中if和case都是用来做流控的。 二、case语法结构 case 变量 in 模式1&#xff09; 命令序列1 ;; 模式2&#xff09; 命令序列2 ;; 模式3&#xff09; 命令序列3 ;; *) 无匹配…