2026/2/10 5:16:55
网站建设
项目流程
网站热力图工具,海口专业的网站开发,淘宝搜索排名,云南俊发建设集团网站在前端开发中#xff0c;JavaScript 数组是使用频率极高的数据结构。掌握数组的各种方法不仅能提升开发效率#xff0c;还能避免因误用而导致的 bug。本文将系统性地梳理常用数组方法#xff0c;重点说明 每个方法是否会修改原数组 以及 返回什么类型的值#xff0c;并辅以…在前端开发中JavaScript 数组是使用频率极高的数据结构。掌握数组的各种方法不仅能提升开发效率还能避免因误用而导致的 bug。本文将系统性地梳理常用数组方法重点说明每个方法是否会修改原数组以及返回什么类型的值并辅以清晰示例助你彻底掌握数组操作。 分类说明我们将数组方法分为两大类会改变原数组的方法Mutating Methods不会改变原数组的方法Non-Mutating / Pure Methods⚠️ 注意有些方法虽然不改变原数组但若数组元素是引用类型如对象、数组其内部属性仍可能被修改。 一、会改变原数组的方法Mutating1.push()作用向数组末尾添加一个或多个元素返回值新数组的长度number是否改变原数组✅ 是let arr [1, 2]; let len arr.push(3, 4); console.log(arr); // [1, 2, 3, 4] console.log(len); // 42.pop()作用删除数组最后一个元素返回值被删除的元素若数组为空则返回undefined是否改变原数组✅ 是let arr [1, 2, 3]; let last arr.pop(); console.log(arr); // [1, 2] console.log(last); // 33.shift()作用删除数组第一个元素返回值被删除的元素空数组返回undefined是否改变原数组✅ 是let arr [1, 2, 3]; let first arr.shift(); console.log(arr); // [2, 3] console.log(first); // 14.unshift()作用在数组开头添加一个或多个元素返回值新数组的长度是否改变原数组✅ 是let arr [2, 3]; let len arr.unshift(0, 1); console.log(arr); // [0, 1, 2, 3] console.log(len); // 45.splice(start, deleteCount, ...items)作用从指定位置删除/替换/添加元素返回值被删除的元素组成的数组若未删除则返回空数组是否改变原数组✅ 是let arr [1, 2, 3, 4]; let removed arr.splice(1, 2, a, b); console.log(arr); // [1, a, b, 4] console.log(removed); // [2, 3]6.reverse()作用反转数组元素顺序返回值反转后的数组注意是原数组的引用是否改变原数组✅ 是let arr [1, 2, 3]; let reversed arr.reverse(); console.log(arr); // [3, 2, 1] console.log(reversed); // [3, 2, 1] — 与 arr 指向同一数组7.sort([compareFunction])作用对数组元素进行排序默认按字符串 Unicode 码返回值排序后的数组原数组的引用是否改变原数组✅ 是let arr [3, 1, 2]; arr.sort((a, b) a - b); console.log(arr); // [1, 2, 3] 提示若要不改变原数组排序请先用slice()或[...arr]复制一份再排序。8.fill(value, start, end)作用用指定值填充数组某段区间返回值被填充后的数组原数组引用是否改变原数组✅ 是let arr [1, 2, 3, 4]; arr.fill(0, 1, 3); console.log(arr); // [1, 0, 0, 4]9.copyWithin(target, start, end)作用浅复制数组的一部分到同一数组的其他位置返回值修改后的数组原数组引用是否改变原数组✅ 是let arr [1, 2, 3, 4, 5]; arr.copyWithin(0, 3, 5); // 将索引3~4的元素复制到开头 console.log(arr); // [4, 5, 3, 4, 5] 二、不会改变原数组的方法Non-Mutating1.concat(...arrays)作用合并两个或多个数组返回值新数组是否改变原数组❌ 否let arr1 [1, 2]; let arr2 [3, 4]; let newArr arr1.concat(arr2); console.log(arr1); // [1, 2]不变 console.log(newArr); // [1, 2, 3, 4]✅ 推荐使用扩展运算符替代[...arr1, ...arr2]2.slice(start, end)作用提取数组片段返回值新数组浅拷贝是否改变原数组❌ 否let arr [1, 2, 3, 4]; let part arr.slice(1, 3); console.log(arr); // [1, 2, 3, 4]不变 console.log(part); // [2, 3]3.map(callback)作用对每个元素调用函数生成新数组返回值转换后的新数组是否改变原数组❌ 否let arr [1, 2, 3]; let doubled arr.map(x x * 2); console.log(arr); // [1, 2, 3]不变 console.log(doubled); // [2, 4, 6]4.filter(callback)作用筛选满足条件的元素返回值新数组是否改变原数组❌ 否let arr [1, 2, 3, 4]; let evens arr.filter(x x % 2 0); console.log(arr); // [1, 2, 3, 4]不变 console.log(evens); // [2, 4]5.reduce(callback, initialValue)作用累积计算归并为单个值返回值累积结果类型由回调决定是否改变原数组❌ 否let arr [1, 2, 3]; let sum arr.reduce((acc, val) acc val, 0); console.log(arr); // [1, 2, 3]不变 console.log(sum); // 66.find(callback)作用查找第一个满足条件的元素返回值找到的元素未找到返回undefined是否改变原数组❌ 否let arr [{id: 1}, {id: 2}]; let item arr.find(x x.id 2); console.log(item); // {id: 2}7.findIndex(callback)作用查找第一个满足条件的元素索引返回值索引未找到返回-1是否改变原数组❌ 否8.every(callback)/some(callback)作用判断所有/部分元素是否满足条件返回值boolean是否改变原数组❌ 否[1, 2, 3].every(x x 0); // true [1, 2, 3].some(x x 2); // true9.includes(value, fromIndex)作用判断数组是否包含某值返回值boolean是否改变原数组❌ 否10.indexOf(value)/lastIndexOf(value)作用查找元素首次/最后一次出现的索引返回值索引未找到返回-1是否改变原数组❌ 否11.join(separator)作用将数组转为字符串返回值字符串是否改变原数组❌ 否[a, b, c].join(-); // a-b-c12.flat(depth)作用扁平化嵌套数组返回值新数组是否改变原数组❌ 否[[1, 2], [3, [4]]].flat(2); // [1, 2, 3, 4]13.flatMap(callback)作用先 map 再 flat深度为1返回值新数组是否改变原数组❌ 否[a b, c d].flatMap(s s.split( )); // [a, b, c, d] 总结表格方法是否改变原数组返回值类型push/pop/shift/unshift✅number长度或元素splice✅被删除元素组成的数组reverse/sort/fill/copyWithin✅原数组引用concat/slice/map/filter/flat/flatMap❌新数组reduce/find/findIndex❌累积值 / 元素 / 索引every/some/includes❌booleanjoin❌stringindexOf/lastIndexOf❌number✅ 最佳实践建议优先使用不可变方法如map,filter便于调试和状态管理尤其在 React/Vue 中。若需修改原数组明确意图否则使用[...arr]或arr.slice()创建副本后再操作。对于排序避免直接arr.sort()推荐const sorted [...arr].sort((a, b) a - b); 结语掌握数组方法的“副作用”是否改变原数组是写出健壮前端代码的关键。希望本文能成为你日常开发的速查手册。欢迎收藏、点赞、评论交流