# subarray **Repository Path**: nodets/subarray ## Basic Information - **Project Name**: subarray - **Description**: 为 JavaScript 数组添加与 TypedArray 行为一致的 subarray方法,支持 ESM、CommonJS 和 IIFE 多种模块格式。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-07 - **Last Updated**: 2025-10-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # subarray 为 JavaScript 数组添加与 TypedArray 行为一致的 `subarray` 方法,支持 ESM、CommonJS 和 IIFE 多种模块格式。 ## 简介 `subarray` 包为普通 JavaScript 数组提供了与 TypedArray 相同的 `subarray` 方法实现。该方法返回原数组的一个子数组视图,修改子数组会影响原数组,反之亦然,完美模拟了 TypedArray 的内存共享特性。 ## 特性 - 与 TypedArray.subarray 行为完全一致 - 支持负数索引(从数组末尾计算) - 自动处理索引边界 - 当 end < begin 时自动交换索引 - 子数组与原数组双向同步修改 - 支持所有核心数组方法(push、pop、splice 等) - 兼容 ESM、CommonJS 和浏览器全局变量 ## 安装 ```bash npm install subarray ``` ## 使用方法 ### ESM (ECMAScript Modules) ```javascript import 'subarray'; const arr = [1, 2, 3, 4, 5]; const sub = arr.subarray(1, 4); ``` ### CommonJS ```javascript require('subarray'); const arr = [1, 2, 3, 4, 5]; const sub = arr.subarray(1, 4); ``` ### IIFE (浏览器直接使用) 通过 script 标签引入,会自动为 Array.prototype 添加 subarray 方法: ```html ``` ## API ### Array.prototype.subarray(begin?: number, end?: number): Array #### 参数 - `begin` (可选): 子数组的起始索引(包含),默认为 0。支持负数(从数组末尾计算)。 - `end` (可选): 子数组的结束索引(不包含),默认为数组长度。支持负数(从数组末尾计算)。 #### 返回值 返回一个新的数组对象,该对象是原数组的子数组视图。 ## 示例 ### 基本用法 ```javascript const original = [10, 20, 30, 40, 50]; // 获取索引 1 到 4 的子数组(不包含 4) const sub1 = original.subarray(1, 4); console.log(sub1); // [20, 30, 40] // 从索引 2 到数组末尾 const sub2 = original.subarray(2); console.log(sub2); // [30, 40, 50] // 使用负数索引(从末尾计算) const sub3 = original.subarray(-3, -1); console.log(sub3); // [30, 40] // 当 end < begin 时自动交换 const sub4 = original.subarray(3, 1); console.log(sub4); // [20, 30] ``` ### 双向同步修改 ```javascript const original = [10, 20, 30, 40, 50]; const sub = original.subarray(1, 4); // [20, 30, 40] // 修改子数组会影响原数组 sub[0] = 200; console.log(original); // [10, 200, 30, 40, 50] // 修改原数组会影响子数组 original[2] = 300; console.log(sub); // [200, 300, 40] // 子数组上的方法操作会影响原数组 sub.push(60); console.log(sub); // [200, 300, 40, 60] console.log(original); // [10, 200, 300, 40, 60, 50] ``` ### 支持数组方法 ```javascript const original = [10, 20, 30, 40, 50]; const sub = original.subarray(1, 4); // [20, 30, 40] // 支持 splice sub.splice(1, 1, 35); console.log(sub); // [20, 35, 40] console.log(original); // [10, 20, 35, 40, 50] // 支持 forEach sub.forEach((value, index) => { console.log(`[${index}]: ${value}`); }); // 支持 map const mapped = sub.map(value => value * 2); console.log(mapped); // [40, 70, 80] ``` ## 注意事项 - 该实现使用 Proxy 实现双向绑定,虽然性能良好,但在极高性能要求的场景下可能不如原生 TypedArray - 不建议在需要严格保持数组纯净性的场景中使用 - 与 TypedArray 不同,这不是真正的内存共享,而是通过代理实现的同步修改 ## 许可证 MIT