ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

uni-app UTS 内置对象 Float64Array 完全指南:构造、静态与实例方法全解析

uni-app UTS 内置对象 Float64Array 完全指南:构造、静态与实例方法全解析 uni-app UTS 内置对象 Float64Array 完全指南构造、静态与实例方法全解析【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-appFloat64Array 是 UTSuni type script语言提供的内置类型化数组TypedArray对象它基于 ArrayBuffer 以 IEEE 754 双精度浮点格式64 位存储二进制数据是 uni-app / uni-app x 跨端开发中处理高精度数值数据、与原生层交换二进制内存的核心工具。本文以 docs/uts/buildin-object-api/float64array.md 为骨架结合 examples/hello-uts/uni_modules/uts-tests/utssdk/TFloat64Array.uts 中的真实测试用例完整讲解其三种构造函数、静态属性与方法、实例属性与全部实例方法并给出各平台兼容性对照读完即可在 UTS 插件或 uvue 页面中直接落地使用。一、认识 Float64ArrayUTS 中的双精度类型化数组1.1 类型化数组与 UTS 的跨端定位在 UTS 语言介绍 中uts 被定义为一门跨平台、高性能、强类型的现代编程语言可编译为 JavaScriptWeb/小程序、KotlinAndroid、SwiftiOS和 ArkTSHarmonyOS。类型化数组TypedArray是 UTS 内建对象体系中用于操作二进制缓冲区的高性能数据结构。Float64Array 与 Float32Array、Int8Array、Int16Array、Int32Array、Uint8Array、Uint16Array、Uint32Array、Uint8ClampedArray 等一同构成 UTS 的 TypedArray 家族。它们不能直接操作底层 ArrayBuffer而是将缓冲区中的数据按特定格式解释通过视图读写内容。1.2 Float64Array 的核心特征元素宽度每个元素占BYTES_PER_ELEMENT 8 字节64 位双精度浮点对应 IEEE 754 double。数值精度相比 Float32Array 的 32 位单精度Float64Array 能表达更高精度的浮点数适合科学计算、坐标、金额等对精度敏感的场景。内存视图同一段 ArrayBuffer 可被多个不同类型化数组以不同视图解读例如用 Float64Array 与 Uint8Array 共享同一缓冲区。索引访问支持float64[0] 42这样的下标读写也支持length、buffer、byteLength、byteOffset等视图元信息。二、三种构造函数从长度、数组与缓冲区创建实例Float64Array 提供三种重载构造函数覆盖了从空长度、从类数组/数组缓冲区、从既有 ArrayBuffer 视图三种典型创建路径。2.1 new(length : number)以指定长度创建一个 Float64Array内部会分配一个大小为length × BYTES_PER_ELEMENT字节的数组缓冲区并以 0 填充。省略所有参数等同于传入 0。参数| 名称 | 类型 | 必填 | 描述 | | :- | :- | :- | :- | | length | number | 是 | 当使用非对象调用时该参数被视为指定类型化数组长度的数字。在内存中创建内部数组缓冲区大小 长度 × BYTES_PER_ELEMENT 字节用 0 填充。省略所有参数等同于使用 0 作为参数。 |返回值Float64Array 实例对象。let float64 new Float64Array(2); // 创建 2 个元素各占 8 字节共 16 字节缓冲区 float64[0] 42; console.log(float64[0]); // 42 console.log(float64.length); // 2对应测试可参考 TFloat64Array.uts 的 testfloat64其中断言Float64Array.BYTES_PER_ELEMENT 8、length 2。2.2 new(array : ArrayLikenumber | ArrayBufferLike)当使用 TypedArray 子类实例调用时typedArray 会被拷贝到一个新的类型化数组中对于非 bigint TypedArray 构造函数如 Float64Array、Int32ArraytypedArray 参数仅可以是非 bigint 类型对于 bigint TypedArray 构造函数BigInt64Array / BigUint64ArraytypedArray 参数仅可以是 bigint 类型typedArray 中的每个值在拷贝到新数组之前都会被转换为构造函数的相应类型新类型化数组的长度与 typedArray 参数的长度相同。参数| 名称 | 类型 | 必填 | 描述 | | :- | :- | :- | :- | | array | ArrayLikenumber | ArrayBufferLike | 是 | 类数组对象需具备 length 属性与数字索引或 ArrayBufferLike 缓冲区元素将按构造函数类型转换后逐项拷贝。 |返回值Float64Array 实例对象。// 从普通数组字面量创建类数组 let x new Float64Array([21, 31, 3]); console.log(x[1]); // 31 // 从另一个 Float64Array 拷贝创建 let y new Float64Array(x); console.log(y[0]); // 212.3 new(buffer : ArrayBufferLike, byteOffset ?: number, length ?: number)当使用 ArrayBuffer 实例以及可选的byteOffset和length参数调用时创建一个指定缓冲区的类型化数组视图byteOffset和length指定视图暴露的内存范围如果忽略两个参数则视图覆盖整个 buffer如果仅忽略 length则是从 byteOffset 开始到 buffer 末尾的剩余部分视图。参数| 名称 | 类型 | 必填 | 描述 | | :- | :- | :- | :- | | buffer | ArrayBufferLike | 是 | ArrayBuffer 实例 | | byteOffset | number | 否 | 可选偏移量单位字节 | | length | number | 否 | 可选视图长度 |let buffer new ArrayBuffer(16); let z new Float64Array(buffer, 2, 4); // 从字节 2 起4 个元素 console.log(z.byteOffset); // 2 console.log(z.length); // 4 let float64 new Float64Array(buffer); // 全视图16 字节 ÷ 8 2 个元素 float64[1] 42; console.log(float64.toString()); // 0,42buffer 的属性描述| 名称 | 类型 | 必备 | 兼容性 | 描述 | | :- | :- | :- | :- | :- | | byteLength | number | 是 | Web: √; Android: 4.25; iOS: 4.11; HarmonyOS: 4.61 | ArrayBuffer 实例的 byteLength 访问器属性返回该数组缓冲区的长度以字节为单位。 |ArrayBufferLike 的方法slice(begin ?: number, end ?: number) : ArrayBuffer返回一个新的 ArrayBuffer包含原缓冲从 begin包含到 end不含的所有字节副本。begin可选起始位置索引从 0 开始将被转换为整数。负数索引从缓冲区末尾计算start 0时使用start buffer.length若start -buffer.length或省略 start 则使用 0若start buffer.length则不提取任何内容。end可选结束位置索引从 0 开始提取到但不包括 end。负数索引从末尾计算end 0时使用end buffer.length若end -buffer.length则使用 0若end buffer.length或省略 end 则使用 buffer.length提取到末尾若标准化后的 end 在 start 之前则不提取任何内容。兼容性Web √Android 4.25iOS 4.11HarmonyOS 4.61。let buffer new ArrayBuffer(16); let float64 new Float64Array(buffer); float64[1] 42; console.log(float64.toString()); // 0,42 let res buffer.slice(8); // 从第 8 字节起拷贝 let sliced new Float64Array(res); console.log(sliced[0]); // 42toByteBuffer() : ByteBuffer返回 Android 原生 ByteBuffer 对象仅 Android 平台可用兼容性Web xAndroid 4.25iOS xHarmonyOS x。toData() : Data返回 iOS 原生 Data 对象文档当前标注各平台均为 x即尚不支持使用前以实际 HBuilderX 版本为准。三、静态属性与静态方法3.1 静态属性 BYTES_PER_ELEMENT数组中每个元素的字节大小Float64Array 固定为 8。console.log(Float64Array.BYTES_PER_ELEMENT); // 83.2 静态方法 of(...items)从一组元素创建一个新数组参数items: number[]要包含在新数组对象中的一组元素返回 Float64Array。var float64Array Float64Array.of(1, 2, 3) console.log(float64Array.toString()); // 1,2,33.3 静态方法 from(arrayLike, mapFn?)从类似数组或可迭代对象创建数组。参数| 名称 | 类型 | 必填 | 描述 | | :- | :- | :- | :- | | arrayLike | ArrayLikenumber | 是 | 要转换为数组的类数组或可迭代对象需具备length: number与数字索引[n: number]: number| | mapfn | (v: number, k: number) number | 否 | 可选。指定后生成的类型化数组会先经过该函数加工处理后再返回 |返回值Float64Array。var float64Array Float64Array.from([1, 2, 3], (v : number, _ : number) : number v v); console.log(float64Array.toString()); // 2,4,6from与of的断言2,4,6与1,2,3同样在 TFloat64Array.uts 的 from/of 方法 中以expect(...).toEqual(...)形式固化。四、实例属性| 属性 | 说明 | | :- | :- | | BYTES_PER_ELEMENT | 数组中每个元素的字节大小实例上同样可访问值为 8 | | buffer | 该视图所引用的底层 ArrayBuffer | | byteLength | 视图覆盖的字节长度 | | byteOffset | 视图在底层 ArrayBuffer 中的起始字节偏移 | | length | 视图中的元素个数 byteLength ÷ BYTES_PER_ELEMENT |配合测试用例可见其一致性new Float64Array(buffer, 2, 4)时byteOffset 2、length 4见 testfloat64。五、实例方法详解5.1 元素写入与批量填充set(array, offset?)从一个数组或类型化数组向当前数组写入元素可选offset指定起始写入位置默认 0。let float64 new Float64Array(8); var array [1, 2, 3]; float64.set(array, 1); console.log(float64.toString()); // 0,1,2,3,0,0,0,0fill(value, start?, end?)用指定值填充数组区间[start, end)start/end支持负数从末尾计算。let float64_t1 new Float64Array([1, 2, 3]).fill(4); console.log(float64_t1.toString()); // 4,4,4 let float64_t2 new Float64Array([1, 2, 3]).fill(4, 1); console.log(float64_t2.toString()); // 1,4,4 let float64_t3 new Float64Array([1, 2, 3]).fill(4, 1, 2); console.log(float64_t3.toString()); // 1,4,3 let float64_t4 new Float64Array([1, 2, 3]).fill(4, 1, 1); // 空区间 console.log(float64_t4.toString()); // 1,2,3 let float64_t5 new Float64Array([1, 2, 3]).fill(4, -3, -2); console.log(float64_t5.toString()); // 4,2,35.2 元素复制与子视图copyWithin(target, start, end?)将数组中[start, end)区间内的元素复制到以target为起点的位置同数组内复制覆盖写入。let float64 new Float64Array(8); float64.set([1, 2, 3], 1); float64.copyWithin(3, 0, 3); console.log(float64.toString()); // 0,1,2,0,1,2,0,0slice(start?, end?)返回一个新 Float64Array包含原数组[start, end)区间的元素副本负数索引从末尾计算不修改原数组。let float64 new Float64Array([1, 2, 3]); console.log(float64.slice(1).toString()); // 2,3 console.log(float64.slice(2).toString()); // 3 console.log(float64.slice(-2).toString()); // 2,3 console.log(float64.slice(0, 1).toString()); // 1文档中还用 1000 个随机数验证slice(1, -1)与原数组逐元素一致new_arr[i - 1] arr[i]该逻辑在 TFloat64Array.uts 的 slice 方法 中对应断言expect(true).toEqual(ret5)。subarray(begin?, end?)返回基于同一底层缓冲区的子视图不拷贝数据修改子视图会影响原数组是零拷贝切片的关键手段。let buffer new ArrayBuffer(32); let float64 new Float64Array(buffer); float64.set([1, 2, 3]); console.log(float64.toString()); // 1,2,3,0 let sub float64.subarray(0, 4); console.log(sub.toString()); // 1,2,3,0subarray与slice的区别需要特别注意slice产生拷贝subarray共享底层内存。这在性能敏感场景如音视频帧、传感器数据流处理中影响显著。5.3 查询与遍历every(predicate)所有元素满足条件则返回 true。回调签名为(value: number, index: number, array: Float64Array) boolean。let result new Float64Array([-10, -20, -30, -40, -50]).every((value : number, _ : number, _a : Float64Array) : boolean value 0); console.log(result); // truesome(predicate)至少一个元素满足条件则返回 true。const float64 new Float64Array([-10, 20, -30, 40, -50]); const positives new Float64Array([10, 20, 30, 40, 50]); console.log(float64.some((element : number, index : number, array : Float64Array) : boolean element 0)); // true console.log(positives.some((element : number, index : number, array : Float64Array) : boolean element 0)); // falsefilter(predicate)返回由满足条件的元素组成的新 Float64Array。let float64 new Float64Array([12, 5, 8, 44]).filter((value : number, _ : number, _a : Float64Array) : boolean value 10); console.log(float64.toString()); // 12,44find(predicate)返回第一个满足条件的元素值找不到返回 undefined。let float64 new Float64Array([4, 5, 8, 12]); let res float64.find((value : number, _ : number, _a : Float64Array) : boolean value 5); console.log(res); // 8findIndex(predicate)返回第一个满足条件的元素下标找不到返回 -1。let float64 new Float64Array([4, 6, 8, 12]); let res float64.findIndex((value : number, _ : number, _a : Float64Array) : boolean value 100); console.log(res); // -1 let ufloat64 new Float64Array([4, 6, 7, 120]); res ufloat64.findIndex((value : number, _ : number, _a : Float64Array) : boolean value 100); console.log(res); // 3indexOf(searchElement, fromIndex?)查找指定元素的下标fromIndex支持负数从末尾计算找不到返回 -1。let float64 new Float64Array([2, 5, 9]); console.log(float64.indexOf(2)); // 0 console.log(float64.indexOf(7)); // -1 console.log(float64.indexOf(9, 2)); // 2 console.log(float64.indexOf(2, -1)); // -1 console.log(float64.indexOf(2, -3)); // 0forEach(callbackfn)对每个元素执行回调(value, index, array)。new Float64Array([0, 1, 2, 3]).forEach((value : number, index : number, _ : Float64Array) { console.log(a[${index}] ${value}); });map(callbackfn)对每个元素加工后返回新 Float64Array原数组不变。let numbers new Float64Array([1, 4, 9]); let doubles numbers.map((value : number, _ : number, _a : Float64Array) : number value * 2); console.log(numbers.toString()); // 1,4,9 console.log(doubles.toString()); // 2,8,18join(separator?)将所有元素拼接为字符串默认分隔符为逗号。let float64 new Float64Array([1, 2, 3]); console.log(float64.join()); // 1,2,3 console.log(float64.join( / )); // 1 / 2 / 3 console.log(float64.join()); // 123toString()返回以逗号分隔的字符串表示等价于无参 join是调试与断言中最常用的方法。5.4 归约与排序reduce(callbackfn)/reduceRight(callbackfn)从左到右reduce或从右到左reduceRight累积归约回调签名为(accumulator, currentValue, index, array) number可传初始值作为第二个参数。let total new Float64Array([0, 1, 2, 3]); let res total.reduce((accumulator : number, currentValue : number, _ : number, _a : Float64Array) : number accumulator currentValue); console.log(res); // 6 total new Float64Array([0, 1, 2, 3]); let res1 total.reduce((accumulator : number, currentValue : number, _ : number, _a : Float64Array) : number accumulator currentValue, 8); console.log(res1); // 14reverse()原地反转数组元素顺序返回原数组引用。let float64 new Float64Array([1, 2, 3]); float64.reverse(); console.log(float64.toString()); // 3,2,1sort(compareFn?)原地排序。默认按数值升序TypedArray 的默认排序是数值排序不同于普通 Array 的字符串排序也可传入比较函数(a, b) a - b自定义顺序。let numbers new Float64Array([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,405.5 迭代器values()、entries()、keys()三者分别返回值、[index, value]键值对、下标的迭代器配合next().value逐个取值。values()let arr new Float64Array([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()let arr new Float64Array([10, 20, 30, 40, 50]); let entries arr.entries(); // #ifndef APP-IOS let value1 entries.next().value[1] // 10 let value2 entries.next().value[1] // 20 console.log(value1) // 10 console.log(value2) // 20 // #endif // #ifdef APP-IOS let value1 entries.next().value![1] // 10iOS 编译为 Swift 后需使用非空断言 ! let value2 entries.next().value![1] // 20 console.log(value1) // 10 console.log(value2) // 20 // #endifkeys()let arr new Float64Array([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注意entries()在 iOSSwift平台对可选值需使用!非空断言访问其它平台直接用[1]下标如上示例通过 UTS 条件编译#ifdef APP-IOS/#ifndef APP-IOS区分这也是 UTS 处理平台差异的标准姿势。六、兼容性一览以下兼容性数据来自 docs/uts/buildin-object-api/float64array.md表中版本号表示支持该特性的最低 HBuilderX / uni-app x 版本。uni-app x 兼容性| Web | Android | iOS | HarmonyOS | iOS(VDOM) UTS 插件 | | :- | :- | :- | :- | :- | | √ | 4.25 | 4.11 | 4.61 | 4.51 |uni-app 兼容性UTS 插件| Android UTS 插件 | iOS UTS 插件 | HarmonyOS UTS 插件 | | :- | :- | :- | | √ | 4.51 | √ |ArrayBufferLike 方法兼容性| 方法 | Web | Android | iOS | HarmonyOS | | :- | :- | :- | :- | :- | | slice(begin?, end?) | √ | 4.25 | 4.11 | 4.61 | | toByteBuffer() | x | 4.25 | x | x | | toData() | x | x | x | x |可见toByteBuffer()是 Android 平台专属的桥接方法返回 Kotlin 原生 ByteBuffer可用于与 Android 原生代码交换二进制数据在 iOS 侧如需原生 Data 对象需等待toData()后续版本支持或借助条件编译自行桥接。七、实战在 UTS 插件中应用 Float64Array7.1 典型使用场景高精度数值批处理传感器数据、音频采样PCM 双精度、图形变换矩阵等对精度敏感且需要连续内存的批量数据。二进制协议编解码配合 ArrayBuffer 解析二进制报文用byteOffset/length精确定位字段区间。与原生层交换数据Android 端通过buffer.toByteBuffer()将内存交给原生代码避免跨语言拷贝。性能优化用subarray做零拷贝切片用set批量写入避免逐元素赋值。7.2 一个完整的组合示例// 1. 创建缓冲区并建立 Float64Array 视图 let buffer new ArrayBuffer(64); let float64 new Float64Array(buffer); // 2. 批量写入 float64.set([1.5, 2.5, 3.5], 0); // 3. 查找与过滤 let found float64.find((v : number) : boolean v 2); // 2.5 let filtered float64.filter((v : number) : boolean v 2); // 2.5,3.5 // 4. 归约求和 let sum float64.reduce((acc : number, cur : number) : number acc cur); // 7.5 // 5. 零拷贝子视图 let sub float64.subarray(1, 3); // 视图指向原缓冲区 [1,3) 区间 // 6. Android 原生 ByteBuffer 桥接条件编译 // #ifdef APP-ANDROID let byteBuffer buffer.toByteBuffer(); // #endif console.log(float64.toString());7.3 用仓库测试用例验证行为仓库 examples/hello-uts/uni_modules/uts-tests/utssdk/TFloat64Array.uts 中实现了from/of/set/copyWithin/every/fill/filter/find/findIndex/forEach/iterator/includes/indexOf/join/keys/map/reduce/reduceRight/reverse/slice/sort/subarray/values/arrayBufferSlice等全部用例是验证本篇文章所有示例输出如0,1,2,0,1,2,0,0、12,44、1,5,40等的权威参照。其中#TEST与#END之间的代码块对应文档示例expect(...).toEqual(...)为断言在 HBuilderX 中运行 uts-tests 测试工程即可一键回归验证。另外Float64Array 与 ArrayBuffer 的协作关系可进一步参考 ArrayBuffer 文档其中ArrayBuffer.isView(float64)返回 true 的示例证明了 Float64Array 作为 ArrayBuffer 视图的身份。八、小结Float64Array 是 UTS 内置的 64 位双精度类型化数组BYTES_PER_ELEMENT 8兼容 Web/Android/iOS/HarmonyOS 全端Android 需 4.25、iOS 4.11、HarmonyOS 4.61iOS UTS 插件 4.51。三种构造函数分别面向「定长创建」「类数组/类型数组拷贝」「ArrayBuffer 视图」三类需求视图模式下务必理解byteOffset、length与底层缓冲区的映射关系。实例方法覆盖完整数组操作写入set/fill、复制copyWithin/slice/subarray、查询every/some/find/findIndex/indexOf/includes、遍历forEach/map/values/entries/keys、归约排序reduce/reduceRight/reverse/sort与输出join/toString。平台差异通过条件编译处理如 entries 在 iOS 需!断言Android 原生二进制桥接使用toByteBuffer()。所有示例输出均可在 TFloat64Array.uts 测试文件中找到对应断言便于边读边验证。【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-app创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进