JavaScript中如何高效将数组复制到大数组的中间位置?
高效替换Uint8Array中间部分的方案
嘿,太懂你这种对性能抠细节的需求了——处理画布图像数据这种高频操作,循环赋值绝对是性能杀手!其实你已经用到了正确的工具,只是没注意到set方法的第二个参数而已😉
Uint8Array.prototype.set()本身就支持指定目标数组的起始偏移位置,完全能实现你要的中间替换效果,而且性能和替换开头的情况一模一样,都是底层级别的内存操作,比手动循环快N倍。
直接看代码示例:
// 初始化你的两个数组 const arr1 = new Uint8Array([0, 0, 0]); const arr2 = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); // 关键:第二个参数3就是arr2的起始索引(对应你说的第4位) arr2.set(arr1, 3); console.log(arr2); // 输出:Uint8Array(10) [0, 1, 2, 0, 0, 0, 6, 7, 8, 9]
为什么这能满足性能需求?
set方法是JavaScript Typed Array的原生方法,它直接在底层复制内存块,没有循环带来的JavaScript层面的性能开销。对于每秒24次的画布数据更新,这个方法完全能扛住,不会成为性能瓶颈。
注意事项
要确保目标数组从起始偏移位置开始,有足够的空间容纳源数组的所有元素,否则会抛出RangeError。比如你的例子中,arr2从索引3开始还有7个元素位置,远大于arr1的3个长度,所以完全没问题。
内容的提问来源于stack exchange,提问作者YAHsaves
相关产品推荐
相关产品推荐

