ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/9/20 17:11:52 拓冰建站 浏览量
uni-app x UTS 内置对象 Int8Array 完全指南:构造、静态成员与全部实例方法详解 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,0new(array : ArrayLikenumber | ArrayBufferLike)以类似数组对象或既有 TypedArray 实例初始化。当传入 TypedArray 子类实例时其元素会被逐一拷贝到新数组并在拷贝前转换为目标类型新数组长度与传入参数长度相同。非 bigint 的 TypedArray 构造函数只能接收非 bigint 参数如 Int32Arraybigint 构造函数BigInt64Array / BigUint64Array同理只能接收 bigint 参数。| 名称 | 类型 | 必填 | 描述 | | :- | :- | :- | :- | | array | ArrayLikenumber | 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,44300 超出 8 位有符号范围后被截断new(buffer : ArrayBufferLike, byteOffset ?: number, length ?: number)基于一个 ArrayBuffer 实例创建视图而不是重新拷贝数据。byteOffset与length指定视图暴露的内存范围两者都省略时视图覆盖整个 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.mdslice(begin ?: number, end ?: number) : ArrayBuffer返回包含原 buffer 从begin含到end不含字节副本的新 ArrayBuffer。负数索引从末尾计算start 0时使用start buffer.lengthstart buffer.length时不提取任何内容end省略或越界时提取到末尾标准化后的end在start之前时也不提取内容。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,3from(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?)将数组中由start与end标识的一段元素复制到从target开始的位置原地操作并返回 this。target、start为负数时视为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,0set(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,0slice(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()); // 1subarray(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); // falsesome(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)); // falsefind(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); // 8findIndex(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); // 3indexOf(searchElement, fromIndex?)返回指定值第一次出现的下标未找到返回 -1fromIndex指定起始搜索位置支持负数从末尾计算。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,18filter(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,44join(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()); // 123toString()返回类型化数组元素的字符串表示等价于无参 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); // 14reduceRight(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,1sort(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,40fill(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()返回按顺序产出数组值的迭代器IterableIteratornumber配合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); // 3entries()返回产出键值对的迭代器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); // 20keys()返回产出索引的迭代器IterableIteratornumber。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] 1、int8[1] 2实现先写字节、再整体发送。websocket.uvue 中基于uni.onSocketMessage的全局 API 也采用了完全一致的处理逻辑get-file-system-manager.uvue 中同样保留了new Int8Array(buffer)的用法注释。这印证了文档中通过类型化数组视图读写 ArrayBuffer的底层设计Int8Array 不拷贝数据、直接引用 buffer 内存天然适合对逐字节协议做解析与构造。兼容性速查下表汇总自 int8array.md 中各成员的兼容性矩阵成员级别兼容性存在差异时以其各自标注为准Web 端通用| 平台维度 | 覆盖范围 | | :- | :- | | uni-app xWeb / Android / iOS / HarmonyOS / iOS VDOM UTS 插件 | √ / 4.25 / 4.11 / 4.61 / 4.51 | | uni-appAndroid 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_ELEMENT、of、from用于便捷创建与元信息查询实例属性buffer、byteLength、byteOffset、length描述视图与底层缓冲区的映射关系二十余个实例方法覆盖复制、查询、遍历、变换、归约、排序与迭代等完整操作面。配合 ArrayBuffer 及同目录下其他 TypedArray 文档如 Uint8Array、Int16Array、Int32Array即可在跨端场景下统一处理文件、网络与协议二进制数据。【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-app创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考