百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

25个每个开发人员都应该掌握的JavaScript 数组方法

myzbx 2025-09-18 23:47 49 浏览

掌握 JavaScript 数组方法是提升开发效率、写出简洁可维护代码的核心能力。以下将 25 个核心数组方法按「遍历查询」「转换处理」「修改操作」「创建合并」四大类分类讲解,每个方法包含作用、语法、参数、返回值、示例,并标注关键注意点(如是否改变原数组)。

一、遍历与查询类(8 个)

这类方法主要用于遍历数组、查询元素或判断条件,大部分不改变原数组

1.forEach()- 基础遍历

  • 作用:遍历数组,对每个元素执行回调函数(无返回值,仅用于 “执行操作”)。
  • 语法:array.forEach(callback(currentValue, index, array), thisArg)
  • 参数
  • callback:必选,每个元素执行的函数,接收 3 个参数:
  • currentValue:当前遍历的元素index:当前元素的索引(可选)
  • array:原数组(可选)
  • thisArg:可选,指定 callback 中的 this 指向。
  • 返回值:undefined(无返回值)
  • 注意:无法通过 break/continue 中断遍历(除了抛出异常)。
const users = [{ name: 'A', age: 20 }, { name: 'B', age: 25 }];
users.forEach(user => {
  console.log(`${user.name} 的年龄是 ${user.age}`);
});
// 输出:A 的年龄是 20;B 的年龄是 25

2.map()- 遍历并转换

  • 作用:遍历数组,对每个元素执行回调函数,返回新数组(新数组长度与原数组一致)。
  • 语法:array.map(callback(currentValue, index, array), thisArg)
  • 返回值:新数组(每个元素是 callback 的返回值)
  • 注意:不改变原数组,若无需返回新数组,用 forEach 更合适。
  • 示例:将用户年龄加 1
const newUsers = users.map(user => ({
  ...user,
  age: user.age + 1 // 原数组元素不变,返回新对象
}));
// newUsers: [{name:'A',age:21}, {name:'B',age:26}]

3.filter()- 筛选元素

  • 作用:遍历数组,筛选出满足 callback 条件(返回 true)的元素,返回新数组
  • 语法:array.filter(callback(currentValue, index, array), thisArg)
  • 返回值:新数组(仅包含满足条件的元素,长度可能小于原数组)
  • 示例:筛选成年用户(age ≥ 18)
const adultUsers = users.filter(user => user.age >= 18);

4.find()- 查找第一个匹配元素

  • 作用:遍历数组,返回第一个满足 callback 条件的元素;若无匹配,返回 undefined。
  • 语法:array.find(callback(currentValue, index, array), thisArg)
  • 返回值:匹配的元素(或 undefined)
  • 注意:找到后立即停止遍历(效率高),不改变原数组。
  • 示例:查找名字为「A」的用户
const userA = users.find(user => user.name === 'A');

5.findIndex()- 查找第一个匹配元素的索引

  • 作用:与 find() 类似,但返回第一个匹配元素的索引;若无匹配,返回 -1。
  • 语法:array.findIndex(callback(currentValue, index, array), thisArg)
  • 返回值:匹配元素的索引(或 -1)
  • 示例:查找年龄为 25 的用户索引
const index = users.findIndex(user => user.age === 25); // 1

6.some()- 判断 “是否有一个” 满足条件

  • 作用:判断数组中是否存在至少一个元素满足 callback 条件,返回布尔值。
  • 语法:array.some(callback(currentValue, index, array), thisArg)
  • 返回值:true(有匹配)/ false(无匹配)
  • 注意:找到一个满足条件的元素后立即停止遍历(短路逻辑)。
  • 示例:判断是否有未成年用户
const hasMinor = users.some(user => user.age < 18); // false

7.every()- 判断 “是否全部” 满足条件

  • 作用:判断数组中所有元素是否都满足 callback 条件,返回布尔值。
  • 语法:array.every(callback(currentValue, index, array), thisArg)
  • 返回值:true(全部满足)/ false(至少一个不满足)
  • 注意:只要有一个元素不满足,立即停止遍历(短路逻辑)。
  • 示例:判断所有用户是否都是成年人
const allAdult = users.every(user => user.age >= 18); // true

8.includes()- 判断是否包含指定元素

  • 作用:判断数组是否包含指定元素,返回布尔值(简单判断,无需回调)。
  • 语法:array.includes(searchElement, fromIndex)
  • 参数:searchElement:必选,要查找的元素fromIndex:可选,从哪个索引开始查找(默认 0,负数表示从末尾倒数)
  • 返回值:true(包含)/ false(不包含)
  • 注意:使用「严格相等(===)」判断,无法判断对象(需用 find)。
  • 示例
const nums = [1, 2, 3];
nums.includes(2); // true
nums.includes(4); // false
nums.includes(1, 1); // false(从索引1开始找1,没有)

二、转换与聚合类(5 个)

这类方法用于将数组转换为其他格式(如值、字符串、扁平数组)或聚合数据。

9.reduce()- 聚合为单个值

  • 作用:遍历数组,通过回调函数将数组元素 “累积” 为单个值(如求和、分组、去重),功能极强。
  • 语法:array.reduce(callback(accumulator, currentValue, index, array), initialValue)
  • 参数
  • callback:必选,累积函数,接收 4 个参数:
  • accumulator:累积结果(上一次回调的返回值,或 initialValue)
  • currentValue:当前元素index:当前索引(可选)
  • array:原数组(可选)
  • initialValue:可选,
  • accumulator 的初始值;若无,默认用数组第一个元素(此时数组为空会报错)。
  • 返回值:最终的累积结果
  • 示例
  • 求和:const sum = [1,2,3].reduce((acc, cur) => acc + cur, 0); // 6
  • 数组去重:const unique = [1,2,2,3].reduce((acc, cur) => acc.includes(cur) ? acc : [...acc, cur], []);
  • 分组(按年龄分组用户):
const grouped = users.reduce((acc, cur) => {
  const key = cur.age; // 按年龄作为键
  acc[key] = acc[key] ? [...acc[key], cur] : [cur];
  return acc;
}, {});

10.flat()- 扁平化数组

  • 作用:将嵌套的数组 “扁平化” 为一维或指定深度的数组,返回新数组
  • 语法:array.flat(depth)
  • 参数:depth:可选,扁平化深度(默认 1,Infinity 表示完全扁平化)。
  • 返回值:扁平化后的新数组
  • 注意:不改变原数组,忽略空元素(如 [1, [2, ,3]].flat() → [1,2,3])。
  • 示例
const nested = [1, [2, [3, 4]]];
nested.flat(); // [1,2,[3,4]](深度1)
nested.flat(2); // [1,2,3,4](深度2)
nested.flat(Infinity); // [1,2,3,4](完全扁平化)

11.flatMap()- 映射后扁平化

  • 作用:先执行 map() 转换,再对结果执行 flat(1) 扁平化,返回新数组(等价于 map().flat(1),但效率更高)。
  • 语法:array.flatMap(callback(currentValue, index, array), thisArg)
  • 返回值:映射 + 扁平化后的新数组
  • 示例:将用户的 “技能数组” 展开为单个技能列表
const usersWithSkills = [
  { name: 'A', skills: ['JS', 'CSS'] },
  { name: 'B', skills: ['HTML', 'React'] }
];
const allSkills = usersWithSkills.flatMap(user => user.skills);
// allSkills: ['JS', 'CSS', 'HTML', 'React']

12.join()- 数组转字符串

  • 作用:将数组元素连接为一个字符串,返回该字符串。
  • 语法:array.join(separator)
  • 参数:separator:可选,连接符(默认是逗号 ,,传空字符串 '' 则无间隔)。
  • 返回值:连接后的字符串
  • 示例
const fruits = ['苹果', '香蕉', '橙子'];
fruits.join(); // "苹果,香蕉,橙子"
fruits.join('|'); // "苹果|香蕉|橙子"

13.toString()- 数组转字符串(简化版)

  • 作用:将数组转为字符串,等价于 join(',')(无参数可选)。
  • 语法:array.toString()
  • 返回值:字符串
  • 示例
[1,2,3].toString(); // "1,2,3"

三、修改与排序类(7 个)

这类方法会改变原数组(需注意副作用,若需不可变操作,可先复制数组)。

14.push()- 末尾添加元素

  • 作用:向数组末尾添加一个或多个元素,返回新数组的长度。
  • 语法:array.push(element1, element2, ...)
  • 返回值:新数组的长度
  • 注意:改变原数组,若需不可变操作,用 [...array, newElement]。
  • 示例
const nums = [1,2];
const len = nums.push(3,4); // len = 4
// nums: [1,2,3,4]

15.pop()- 末尾删除元素

  • 作用:删除数组最后一个元素,返回被删除的元素。
  • 语法:array.pop()
  • 返回值:被删除的元素(若数组为空,返回 undefined)
  • 注意:改变原数组,效率高(无需移动其他元素)。
  • 示例
const nums = [1,2,3];
const deleted = nums.pop(); // deleted = 3
// nums: [1,2]

16.unshift()- 开头添加元素

  • 作用:向数组开头添加一个或多个元素,返回新数组的长度。
  • 语法:array.unshift(element1, element2, ...)
  • 返回值:新数组的长度
  • 注意:改变原数组,效率低(需移动所有现有元素)。
  • 示例
const nums = [3,4];
const len = nums.unshift(1,2); // len = 4
// nums: [1,2,3,4]

17.shift()- 开头删除元素

  • 作用:删除数组第一个元素,返回被删除的元素。
  • 语法:array.shift()
  • 返回值:被删除的元素(若数组为空,返回 undefined)
  • 注意:改变原数组,效率低(需移动所有现有元素)。
  • 示例
const nums = [1,2,3];
const deleted = nums.shift(); // deleted = 1
// nums: [2,3]

18.splice()- 插入 / 删除 / 替换元素

  • 作用:对数组进行插入、删除、替换操作(功能最灵活,但也最容易出错)。
  • 语法:array.splice(start, deleteCount, item1, item2, ...)
  • 参数
  • start:必选,操作的起始索引(负数表示从末尾倒数)。
  • deleteCount:必选,要删除的元素个数(0 表示不删除)。
  • item1...:可选,要插入的元素(在 start 位置后插入)。
  • 返回值:被删除元素组成的数组(若未删除,返回空数组)
  • 注意:改变原数组,需谨慎使用(建议先复制数组再操作)。
  • 示例
const nums = [1,2,3,4,5];
// 1. 删除:从索引2开始,删除2个元素
nums.splice(2, 2); // 返回 [3,4],nums 变为 [1,2,5]
// 2. 替换:从索引1开始,删除1个元素,插入6
nums.splice(1, 1, 6); // 返回 [2],nums 变为 [1,6,5]
// 3. 插入:从索引2开始,删除0个元素,插入7,8
nums.splice(2, 0, 7, 8); // 返回 [],nums 变为 [1,6,7,8,5]

19.sort()- 排序数组

  • 作用:对数组元素进行排序,返回排序后的数组(改变原数组)。
  • 语法:array.sort(compareFunction)
  • 参数
  • compareFunction(a, b):可选,排序规则函数:
  • 若 compareFunction(a,b) < 0:a 排在 b 前面。
  • 若 compareFunction(a,b) === 0:a 和 b 位置不变。
  • 若 compareFunction(a,b) > 0:a 排在 b 后面。
  • 注意
  • 默认按「字符串 Unicode 码」排序(如 [10,2].sort() → [10,2],因为 '10' < '2')。
  • 必须传 compareFunction 才能正确排序数字。
  • 示例
const nums = [3,1,4,1,5];
// 升序排序(数字)
nums.sort((a, b) => a - b); // [1,1,3,4,5]
// 降序排序(数字)
nums.sort((a, b) => b - a); // [5,4,3,1,1]
// 按用户年龄升序排序
users.sort((a, b) => a.age - b.age);

20.reverse()- 反转数组

  • 作用:反转数组元素的顺序,返回反转后的数组(改变原数组)。
  • 语法:array.reverse()
  • 返回值:反转后的原数组
  • 示例
const nums = [1,2,3];
nums.reverse(); // 返回 [3,2,1],nums 变为 [3,2,1]

四、创建与合并类(5 个)

这类方法用于创建新数组或合并多个数组,不改变原数组

21.slice()- 截取数组(创建子数组)

  • 作用:从原数组中截取指定范围的元素,返回新数组(不改变原数组)。
  • 语法:array.slice(start, end)
  • 参数
  • start:可选,起始索引(默认 0,负数表示从末尾倒数)。
  • end:可选,结束索引(不包含该索引,默认数组长度)。
  • 返回值:截取的子数组(若 start >= end,返回空数组)
  • 注意:与 splice() 区别:slice 不改变原数组,splice 改变原数组。
  • 示例
const nums = [1,2,3,4,5];
nums.slice(1, 3); // [2,3](从索引1到3,不包含3)
nums.slice(2); // [3,4,5](从索引2到末尾)
nums.slice(-2); // [4,5](从末尾倒数2个元素)

22.concat()- 合并数组

  • 作用:合并两个或多个数组,返回新数组(不改变原数组)。
  • 语法:array1.concat(array2, array3, ..., valueN)
  • 参数:可传数组或单个值(单个值会直接加入新数组)。
  • 返回值:合并后的新数组
  • 注意:ES6 后常用扩展运算符 [...arr1, ...arr2] 替代(更简洁)。
  • 示例
const a = [1,2];
const b = [3,4];
const c = a.concat(b, 5); // [1,2,3,4,5]
// 等价于:const c = [...a, ...b, 5];

23.Array.from()- 从类数组 / 可迭代对象创建数组

  • 作用:将「类数组对象」(如 arguments、DOM 节点列表)或「可迭代对象」(如 Set、Map)转换为真正的数组。
  • 语法:Array.from(arrayLike, mapFn, thisArg)
  • 参数
  • arrayLike:必选,要转换的类数组 / 可迭代对象。
  • mapFn:可选,类似 map() 的回调函数(转换时同步处理元素)。
  • thisArg:可选,mapFn 中的 this 指向。
  • 返回值:新数组
  • 示例
// 1. 类数组(arguments)转数组
function sum() {
  return Array.from(arguments).reduce((acc, cur) => acc + cur, 0);
}
sum(1,2,3); // 6

// 2. Set 转数组(去重)
const set = new Set([1,2,2,3]);
Array.from(set); // [1,2,3]

// 3. 转换时处理元素(等价于 Array.from(set).map(x => x*2))
Array.from(set, x => x * 2); // [2,4,6]

24.Array.of()- 创建指定元素的数组

  • 作用:创建一个包含指定元素的数组(解决 new Array() 的歧义问题)。
  • 语法:Array.of(element1, element2, ...)
  • 返回值:新数组
  • 注意:与 new Array() 的区别:new Array(3) → 创建长度为 3 的空数组(无元素)。Array.of(3) → 创建 [3](包含元素 3)。
  • 示例
Array.of(1,2,3); // [1,2,3]
Array.of(5); // [5]
new Array(5); // [empty × 5](空数组,长度5)

25.at()- 通过索引访问元素(支持负索引)

  • 作用:通过索引访问数组元素,支持负索引(-1 表示最后一个元素,-2 表示倒数第二个,以此类推)。
  • 语法:array.at(index)
  • 参数:index:索引(正数 / 负数,默认 0)。
  • 返回值:指定索引的元素(若索引超出范围,返回 undefined)
  • 注意:替代传统的 array[index](传统方式不支持负索引,如 array[-1] 会返回 undefined)。
  • 示例
const nums = [1,2,3,4];
nums.at(0); // 1(第一个元素)
nums.at(-1); // 4(最后一个元素)
nums.at(-2); // 3(倒数第二个元素)
nums.at(10); // undefined(索引超出范围)

总结:核心使用原则

  1. 优先避免改变原数组:若需不可变操作,用 map/filter/slice/concat 或扩展运算符 [...arr],减少副作用。
  2. 按需选择方法:需返回新数组 → map/filter/slice/concat。需聚合值 → reduce(求和、分组、去重)。需查找元素 → find(元素)/findIndex(索引)/includes(简单判断)。需判断条件 → some(任一满足)/every(全部满足)。
  3. 注意效率:push/pop 效率高于 unshift/shift(后者需移动元素);find/some/every 找到结果后立即停止遍历(短路逻辑)。

掌握这些方法,能大幅减少手写循环的代码量,让逻辑更清晰,同时提升代码的可读性和可维护性。

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 &quot;小贱贱&quot;韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...