原生js:Array 和 TypedArray 对比

概述

  • Array 适合普通的动态和混合数据存储
  • TypedArray 适合高性能应用,比如图像处理、音视频解码、科学计算和游戏开发
  • 根据存储范围和精度需求选择合适的 TypedArray 类型,比如 Uint8Array 用于像素,Float32Array 用于 3D 图形(如经纬度),BigInt64Array 用于超大整数计算

Array

let data = [1, "name", true, { key: "value" }];
data.push(100); // 动态扩展数组

作用

  • 普通的数组操作,比如存储不同类型的元素
  • 动态添加或删除元素的场景
  • 对性能或内存要求不高的场景

TypedArray

- 有符号整数
- Int8Array  -> [-1*2**7, 2**7-1] => [-128,127]
- Int16Array  -> [-1*2**15, 2**15-1] => [-32768,32767]
- Int32Array  -> [-1*2**31, 2**31-1]
- 无符号整数(不能为负数,可为0)
- Uint8Array  -> [0, 2**8 - 1] => [0,255]
- Uint16Array  -> [0, 2**16 - 1] => [0,65535]
- Uint32Array  -> [0, 2**32 - 1]
- 无符号整数 + 自动截断(不能为负数,可为0)
- Uint8ClampedArray  -> [0, 2**8 - 1] => [0,255]
- 浮点数
- Float32Array  -> 精度约 7- Float64Array  -> 精度约 15- 有符号大整数
- BigInt64Array  -> -2^63 ~ 2^63-1
- 无符号大整数(不能为负数,可为0)
- BigUint64Array  -> 0 ~ 2^64-1

作用

  • 提供连续的内存块,用于存储单一类型的值
  • 支持高效的数值计算操作,直接操作底层内存
  • 比普通数组更、更高效,特别适合处理大量相同类型的数据

全面对比

特性ArrayInt8ArrayUint8ArrayUint8ClampedArrayInt16ArrayUint16ArrayInt32ArrayUint32ArrayFloat32ArrayFloat64ArrayBigInt64ArrayBigUint64Array
存储类型任意类型8 位有符号整数8 位无符号整数8 位无符号整数(取整)16 位有符号整数16 位无符号整数32 位有符号整数32 位无符号整数32 位浮点数64 位浮点数64 位有符号大整数64 位无符号大整数
范围任意-128 ~ 1270 ~ 2550 ~ 255(截断)-32,768 ~ 32,7670 ~ 65,535-2^31 ~ 2^31-10 ~ 2^32-1精度约 7精度约 15-2^63 ~ 2^63-10 ~ 2^64-1
动态长度
存储精度动态类型整数整数整数(截断范围)整数整数整数整数浮点数双精度浮点数大整数大整数
内存模型不连续连续连续连续连续连续连续连续连续连续连续连续
性能较慢高性能高性能高性能高性能高性能高性能高性能高性能高性能较高性能较高性能
超出范围处理任意存储截断截断截断为 0~255截断截断截断截断超范围为 Infinity超范围为 Infinity截断截断
是否支持浮点数
是否支持负数
支持的方法多种操作灵活基本数组操作基本数组操作基本数组操作基本数组操作基本数组操作基本数组操作基本数组操作基本数组操作基本数组操作基本数组操作基本数组操作

TypedArray的单个解析

Int8Array

场景:用于二进制数据处理或处理需要小范围整数的应用程序,如图像处理中的灰度值(-128 到 127 表示灰度变化)

let int8 = new Int8Array(100); // 分配 100 个字节,初始化为 0
int8[0] = 120; // 存储一个小范围整数

Uint8Array

场景:适合存储非负小范围整数,节省内存,如图像像素数据处理:存储 RGB 值(0-255)

let uint8 = new Uint8Array([255, 128, 64]); // RGB 值
console.log(uint8[0]); // 输出:255

Uint8ClampedArray

场景:与 Uint8Array 类似,但值超出范围时会自动截断(0-255),如图像数据的颜色处理,避免颜色值超出范围

let clamped = new Uint8ClampedArray(3);
clamped[0] = 300; // 超出范围自动截断为 255
console.log(clamped[0]); // 输出:255

Int16Array

场景:适合存储中等范围的整数,如传感器数据:如陀螺仪、加速度计输出的整数值

let int16 = new Int16Array(5);
int16[0] = 32000; // 存储中等范围整数

Uint16Array

场景:适合存储非负中等范围的整数,如音频和视频编码:存储帧索引或采样数据

let uint16 = new Uint16Array(3);
uint16[0] = 60000; // 存储较大的无符号整数

Int32Array

场景:适合存储大范围整数,如存储对象 ID,或需要高精度整数的应用场景

let int32 = new Int32Array([2147483647, -2147483648]); // 32 位整数
console.log(int32[0]); // 输出:2147483647

Uint32Array

场景:适合存储非负大范围整数,如存储大文件的偏移值或索引,处理需要超大非负整数的高性能应用

let uint32 = new Uint32Array(3);
uint32[0] = 4294967295; // 最大值
console.log(uint32[0]); // 输出:4294967295

Float32Array

场景:存储 32 位浮点数,提供高效的浮点数存储和计算,如3D 图形计算:如存储顶点坐标、法线向量

let float32 = new Float32Array([0.1, 0.2, 0.3]);
console.log(float32[0]); // 输出:0.1

Float64Array

场景:存储 64 位双精度浮点数,支持更高精度的小数,如地理信息系统(GIS):存储经纬度坐标

let float64 = new Float64Array([0.123456789123456]);
console.log(float64[0]); // 输出高精度值

BigInt64Array

场景:适合需要处理超过普通整数范围的数据,如大数据应用,如存储文件偏移值或计数器

let bigInt64 = new BigInt64Array([BigInt(-9223372036854775808)]);
console.log(bigInt64[0]); // 输出:-9223372036854775808n

BigUint64Array

场景:用于存储大范围非负整数,如高性能服务器应用,大文件索引,区块链中的超大数值处理

let bigUint64 = new BigUint64Array([BigInt(18446744073709551615)]);
console.log(bigUint64[0]); // 输出:18446744073709551615n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳晓黑胡椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值