uni-app x UTS 内置对象 Int8Array 完全指南:构造、静态成员与全部实例方法详解
2026/9/20 17:11:49 网站建设 项目流程

uni-app x UTS 内置对象 Int8Array 完全指南:构造、静态成员与全部实例方法详解

【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-app

本指南以 uni-app x 的 UTS 内置对象文档(int8array.md)为骨架,系统讲解 Int8Array 的类型定义、三种构造函数重载、静态属性与方法、实例属性,以及 copyWithin、fill、filter、reduce、subarray 等全部实例方法,并结合仓库内 WebSocket 二进制通信等真实用法,帮助你在一端代码里安全高效地处理 8 位有符号整型二进制数据。

Int8Array 是什么

Int8Array 是 UTS 提供的内置类型化数组(Typed Array)之一,用于表示底层二进制缓冲区中按 8 位有符号整数(范围 -128 ~ 127)解释的一段视图。它与 ArrayBuffer 的关系是:ArrayBuffer 只是通用的原始字节缓冲区,你不能直接读写其中的内容,必须通过类型化数组(如 Float32Array、Float64Array、Int8Array、Int16Array、Int32Array、Uint8Array、Uint8ClampedArray、Uint16Array、Uint32Array)或 DataView 来读写缓冲区内容。

每个 Int8Array 元素占 1 字节(即静态属性BYTES_PER_ELEMENT恒为 1),因此它是最贴近"逐字节"操作的视图类型,常用于解析协议帧、读取文件二进制内容、处理 WebSocket 二进制消息等场景。

构造函数

Int8Array 共有三种重载形式,分别面向"按长度初始化""按已有数组/视图初始化""按 ArrayBuffer 切片创建视图"三类需求。

new(length : number)

以数字length作为元素个数创建对象:内部会分配一个大小为length × BYTES_PER_ELEMENT(即length)字节的缓冲区,并用 0 填充所有元素。省略所有参数等价于传入 0。

| 名称 | 类型 | 必填 | 描述 | | :- | :- | :- | :- | | length | number | 是 | 指定类型化数组长度的数字,内存中创建length × BYTES_PER_ELEMENT字节的内部缓冲区,用 0 填充;省略参数等同于使用 0 |

let int8 = new Int8Array(8); console.log(int8.toString()); // "0,0,0,0,0,0,0,0"

new(array : ArrayLike<number> | ArrayBufferLike)

以类似数组对象或既有 TypedArray 实例初始化。当传入 TypedArray 子类实例时,其元素会被逐一拷贝到新数组,并在拷贝前转换为目标类型;新数组长度与传入参数长度相同。非 bigint 的 TypedArray 构造函数只能接收非 bigint 参数(如 Int32Array),bigint 构造函数(BigInt64Array / BigUint64Array)同理只能接收 bigint 参数。

| 名称 | 类型 | 必填 | 描述 | | :- | :- | :- | :- | | array | ArrayLike<number> | ArrayBufferLike | 是 | 待转换的类数组或可迭代对象 / 被拷贝的 TypedArray 实例 |

let int8 = new Int8Array([1, 2, 3]); console.log(int8.toString()); // "1,2,3" // 从既有 TypedArray 拷贝(元素按目标类型转换) let from32 = new Int8Array(new Int32Array([1, 2, 300])); console.log(from32.toString()); // "1,2,44"(300 超出 8 位有符号范围后被截断)

new(buffer : ArrayBufferLike, byteOffset ?: number, length ?: number)

基于一个 ArrayBuffer 实例创建"视图",而不是重新拷贝数据。byteOffsetlength指定视图暴露的内存范围:两者都省略时视图覆盖整个 buffer;只省略length时,视图为从byteOffset起到 buffer 末尾的剩余部分。视图与 buffer 共享同一块内存,修改视图会直接反映到底层缓冲区。

| 名称 | 类型 | 必填 | 描述 | | :- | :- | :- | :- | | buffer | ArrayBufferLike | 是 | ArrayBuffer 实例 | | byteOffset | number | 否 | 偏移量,单位字节 | | length | number | 否 | 长度 |

let buffer = new ArrayBuffer(8); let int8 = new Int8Array(buffer); int8.set([1, 2, 3]); console.log(int8.toString()); // "1,2,3,0,0,0,0,0" // 从第 4 字节开始、长度 4 的视图 let sub = new Int8Array(buffer, 4, 4); console.log(sub.toString()); // "0,0,0,0"

其中 buffer 参数必须具备byteLength属性(返回该 ArrayBuffer 实例的字节长度,Web 与各端均已支持)。

ArrayBufferLike 的成员方法

构造函数涉及的 buffer 对象还附带以下与底层平台交互相关的方法(详见 arraybuffer.md):

  • slice(begin ?: number, end ?: number) : ArrayBuffer:返回包含原 buffer 从begin(含)到end(不含)字节副本的新 ArrayBuffer。负数索引从末尾计算(start < 0时使用start + buffer.length);start >= buffer.length时不提取任何内容;end省略或越界时提取到末尾;标准化后的endstart之前时也不提取内容。
  • toByteBuffer() : ByteBuffer:返回 Android 原生 ByteBuffer 对象,仅 Android 4.25+ 支持(其余端标记为 x)。
  • toData() : Data:返回 iOS 原生 Data 对象,当前各端均标记为 x。

静态属性与静态方法

BYTES_PER_ELEMENT(静态属性)

返回数组中每个元素的字节大小,Int8Array 恒为 1。它同时以静态属性和实例属性两种形式暴露。

of(...items)

从一组元素创建一个新 Int8Array。

| 名称 | 类型 | 必填 | 描述 | | :- | :- | :- | :- | | items | number[] | 是 | 要包含在新数组中的一组元素 |

var array = Int8Array.of(1, 2, 3) console.log(array.toString()); // '1,2,3'

from(arrayLike, mapFn?)

从类数组或可迭代对象创建数组。可选的mapFn会在元素写入前进行加工,签名与数组方法保持一致:(v: number, k: number) => number

arrayLike必须具备length: number与下标访问[n: number]: number的类数组结构。

var array = Int8Array.from([1, 2, 3], (v : number, _ : number) : number => v + v); console.log(array.toString()); // '2,4,6'

实例属性

| 属性 | 描述 | | :- | :- | | BYTES_PER_ELEMENT | 数组中每个元素的字节大小(Int8Array 为 1) | | buffer | 数组所引用的 ArrayBuffer 实例 | | byteLength | 数组的字节长度 | | byteOffset | 数组在底层 buffer 中的字节偏移量 | | length | 数组的元素个数 |

这四个"描述性"属性(buffer / byteLength / byteOffset / length)与数组元素本身一样,可通过int8[0]下标读写元素值。

实例方法详解

实例方法可分为"视图与复制类""查询与判定类""遍历与变换类""归约类""排序与填充类""迭代器类"六组,以下逐一说明参数语义与返回值,并保留文档中的可运行示例。

视图与复制类

copyWithin(target, start, end?)

将数组中由startend标识的一段元素复制到从target开始的位置,原地操作并返回 this。targetstart为负数时视为length + 该值end省略时使用数组长度。

let int8 = new Int8Array(8); int8.set([1, 2, 3], 1); int8.copyWithin(3, 0, 3); console.log(int8.toString()); // "0,1,2,0,1,2,0,0"

set(array, offset?)

将一个值或类数组(须具备length[n: number])写入当前数组,offset指定起始写入下标,返回 void。

let int8 = new Int8Array(8); var array = [1, 2, 3]; int8.set(array, 1); console.log(int8.toString()); // "0,1,2,3,0,0,0,0"

slice(start?, end?)

返回包含指定区间元素(含start、不含end)的新 Int8Array,原数组不变;支持负数索引。

let int8 = new Int8Array([1, 2, 3]); console.log(int8.slice(1).toString()); // "2,3" console.log(int8.slice(-2).toString()); // "2,3" console.log(int8.slice(0, 1).toString()); // "1"

subarray(begin?, end?)

返回共享同一块 ArrayBuffer 存储的新 Int8Array 视图,引用从begin(含)到end(不含)的元素。与slice复制元素不同,subarray与源数组共享底层内存。

let buffer = new ArrayBuffer(8); let int8 = new Int8Array(buffer); int8.set([1, 2, 3]); console.log(int8.toString()); // "1,2,3,0,0,0,0,0" let sub = int8.subarray(0, 4); console.log(sub.toString()); // "1,2,3,0"

查询与判定类

every(predicate)

对每个元素调用predicate(value, index, array),一旦某次返回可转为 false 的值即立即返回 false,否则返回 true。

let result = new Int8Array([12, 5, 8, 130, 44]).every((value : number, _ : number, _a : Int8Array) : boolean => value < 40 ); console.log(result); // false

some(predicate)

与 every 相对:一旦 predicate 返回可转为 true 的值即返回 true,否则返回 false。

const int8 = new Int8Array([-10, 20, -30, 40, -50]); const positives = new Int8Array([10, 20, 30, 40, 50]); console.log(int8.some((element : number, index : number, array : Int8Array) : boolean => element < 0)); // true console.log(positives.some((element : number, index : number, array : Int8Array) : boolean => element < 0)); // false

find(predicate)

返回第一个使 predicate 为 true 的元素的值,未找到返回 undefined。

let int8 = new Int8Array([4, 5, 8, 12]); let res = int8.find((value : number, _ : number, _a : Int8Array) : boolean => value > 5); console.log(res); // 8

findIndex(predicate)

返回第一个使 predicate 为 true 的元素的下标,未找到返回 -1。

let int8 = new Int8Array([4, 6, 8, 12]); let res = int8.findIndex((value : number, _ : number, _a : Int8Array) : boolean => value > 100); console.log(res); // -1 int8 = new Int8Array([4, 6, 7, 120]); let res1 = int8.findIndex((value : number, _ : number, _a : Int8Array) : boolean => value > 100); console.log(res1); // 3

indexOf(searchElement, fromIndex?)

返回指定值第一次出现的下标,未找到返回 -1;fromIndex指定起始搜索位置,支持负数(从末尾计算)。

let int8 = new Int8Array([2, 5, 9]); console.log(int8.indexOf(2)); // 0 console.log(int8.indexOf(7)); // -1 console.log(int8.indexOf(9, 2)); // 2 console.log(int8.indexOf(2, -1)); // -1 console.log(int8.indexOf(2, -3)); // 0

遍历与变换类

forEach(callbackfn)

对每个元素依次调用callbackfn(value, index, array),返回 void。

new Int8Array([0, 1, 2, 3]).forEach((value : number, index : number, _a : Int8Array) => { console.log(`a[${index}] = ${value}`); });

map(callbackfn)

对每个元素调用callbackfn(value, index, array) => number,返回包含执行结果的新 Int8Array,原数组不变。

let numbers = new Int8Array([1, 4, 9]); let doubles = numbers.map((value : number, _ : number, _a : Int8Array) : number => value * 2); console.log(numbers.toString()); // "1,4,9" console.log(doubles.toString()); // "2,8,18"

filter(predicate)

返回由通过 predicate 的元素组成的新 Int8Array。

let int8 = new Int8Array([12, 5, 8, 44]).filter((value : number, _ : number, _a : Int8Array) : boolean => value >= 10 ); console.log(int8.toString()); // "12,44"

join(separator?)

将所有元素以separator连接成字符串,省略时使用逗号。

let int8 = new Int8Array([1, 2, 3]); console.log(int8.join()); // "1,2,3" console.log(int8.join(" / ")); // "1 / 2 / 3" console.log(int8.join("")); // "123"

toString()

返回类型化数组元素的字符串表示(等价于无参 join)。

归约类

reduce(callbackfn)

从第一个元素起,按callbackfn(previousValue, currentValue, currentIndex, array) => number逐个累加,返回归约结果。示例展示了不传初值(从 0 累加到 3 得 6)与传入初值 8(得 14)两种用法。

let total = new Int8Array([0, 1, 2, 3]); let res = total.reduce((accumulator : number, currentValue : number, _ : number, _a : Int8Array) : number => accumulator + currentValue); console.log(res); // 6 total = new Int8Array([0, 1, 2, 3]); let res1 = total.reduce((accumulator : number, currentValue : number, _ : number, _a : Int8Array) : number => accumulator + currentValue, 8); console.log(res1); // 14

reduceRight(callbackfn)

与 reduce 相同,但从最后一个元素向第一个元素处理,同样支持可选的初始值。

let total = new Int8Array([0, 1, 2, 3]); let res = total.reduceRight((accumulator : number, currentValue : number, _ : number, _a : Int8Array) : number => accumulator + currentValue); console.log(res); // 6 total = new Int8Array([0, 1, 2, 3]); let res1 = total.reduceRight((accumulator : number, currentValue : number, _ : number, _a : Int8Array) : number => accumulator + currentValue, 8); console.log(res1); // 14

排序与填充类

reverse()

原地反转数组元素,返回翻转后的数组(返回类型为 Int8Array)。

let int8 = new Int8Array([1, 2, 3]); int8.reverse(); console.log(int8.toString()); // "3,2,1"

sort(compareFn?)

原地排序并返回 this。省略compareFn时按升序排序;传入(a, b) => number自定义比较逻辑。

let numbers = new Int8Array([40, 1, 5]); numbers.sort(); console.log(numbers.toString()); // "1,5,40" numbers.sort((a, b) : number => a - b); console.log(numbers.toString()); // "1,5,40"

fill(value, start?, end?)

用静态值value填充区间[start, end)并返回修改后的数组。start/end支持负数(视为length + 该值),end省略时填到末尾。

console.log(new Int8Array([1, 2, 3]).fill(4).toString()); // "4,4,4" console.log(new Int8Array([1, 2, 3]).fill(4, 1).toString()); // "1,4,4" console.log(new Int8Array([1, 2, 3]).fill(4, 1, 2).toString()); // "1,4,3" console.log(new Int8Array([1, 2, 3]).fill(4, 1, 1).toString()); // "1,2,3"(空区间) console.log(new Int8Array([1, 2, 3]).fill(4, -3, -2).toString()); // "4,2,3"

迭代器类

values()

返回按顺序产出数组值的迭代器IterableIterator<number>,配合next().value逐项消费。

let arr = new Int8Array([1, 2, 3]); let values = arr.values(); console.log(values.next().value); // 1 console.log(values.next().value); // 2 console.log(values.next().value); // 3

entries()

返回产出键值对的迭代器IterableIterator<[number, number]>。注意 iOS 端对可选链取值写法有差异:非 iOS 端使用entries.next().value[1],iOS 端需要非空断言entries.next().value![1](可用条件编译区分)。

let arr = new Int8Array([10, 20, 30, 40, 50]); let entries = arr.entries(); // #ifndef APP-IOS let ret1 = entries.next().value[1] let ret2 = entries.next().value[1] // #endif // #ifdef APP-IOS let ret1 = entries.next().value![1] let ret2 = entries.next().value![1] // #endif console.log(ret1); // 10 console.log(ret2); // 20

keys()

返回产出索引的迭代器IterableIterator<number>

let arr = new Int8Array([10, 20, 30, 40, 50]); let keys = arr.keys(); console.log(keys.next().value); // 0 console.log(keys.next().value); // 1 console.log(keys.next().value); // 2 console.log(keys.next().value); // 3 console.log(keys.next().value); // 4

实战:WebSocket 二进制消息处理

仓库示例工程(src/pages/API/websocket/socketTask.uvue)展示了 Int8Array 在真实业务中的两种典型用法:

  • 接收二进制帧onMessage回调中先判断res.data instanceof ArrayBuffer,再用new Int8Array(res.data)建立视图,最后通过int8.toString()将二进制内容转为可读字符串;
  • 发送二进制数据sendArrayBuffer中创建new ArrayBuffer(2),再用new Int8Array(data)视图写入int8[0] = 1int8[1] = 2,实现"先写字节、再整体发送"。

websocket.uvue 中基于uni.onSocketMessage的全局 API 也采用了完全一致的处理逻辑;get-file-system-manager.uvue 中同样保留了new Int8Array(buffer)的用法注释。这印证了文档中"通过类型化数组视图读写 ArrayBuffer"的底层设计:Int8Array 不拷贝数据、直接引用 buffer 内存,天然适合对逐字节协议做解析与构造。

兼容性速查

下表汇总自 int8array.md 中各成员的兼容性矩阵(成员级别兼容性存在差异时以其各自标注为准,Web 端通用):

| 平台维度 | 覆盖范围 | | :- | :- | | uni-app x(Web / Android / iOS / HarmonyOS / iOS VDOM UTS 插件) | √ / 4.25 / 4.11 / 4.61 / 4.51 | | uni-app(Android UTS 插件 / iOS UTS 插件 / HarmonyOS UTS 插件) | √ / 4.51 / √ | | 特例:ArrayBuffer.toByteBuffer() | 仅 Android 4.25 支持(Web / iOS / HarmonyOS 为 x) | | 特例:ArrayBuffer.toData() | 当前各端均为 x |

总结

Int8Array 是 uni-app x UTS 中操作底层二进制数据的核心内置对象之一:构造函数支持按长度初始化、从类数组/既有 TypedArray 拷贝、以及基于 ArrayBuffer 创建共享内存视图三种形态;静态成员BYTES_PER_ELEMENToffrom用于便捷创建与元信息查询;实例属性bufferbyteLengthbyteOffsetlength描述视图与底层缓冲区的映射关系;二十余个实例方法覆盖复制、查询、遍历、变换、归约、排序与迭代等完整操作面。配合 ArrayBuffer 及同目录下其他 TypedArray 文档(如 Uint8Array、Int16Array、Int32Array),即可在跨端场景下统一处理文件、网络与协议二进制数据。

【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-app

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询