javascript中数组的基本操作方法有哪些?【教程】

JavaScript数组操作应按增删改查、遍历、转换分类理解:push/unshift改原数组,concat/展开运算符不修改;splice万能但易错,filter逻辑删除;indexOf不支持NaN而includes支持;map生成新数组,forEach无返回值,reduce需注意初始值。

JavaScript 数组的常用操作方法不是靠死记,而是按「增删改查 + 遍历 + 转换」这几类场景来理解最稳。下面挑真正高频、易错、有坑的说。

添加元素:push、unshift、concat 和展开运算符的区别

pushunshift 直接修改原数组,前者尾部加、后者头部加,都返回新长度;concat 不改原数组,但只浅合并,遇到嵌套数组不会递归扁平;更推荐用展开运算符 [...arr, newItem][newItem, ...arr],语义清晰、不可变、兼容性好(ES2015+)。

  • push 性能优于 unshift(后者要移动所有已有元素)
  • concat 传入对象或原始值时会自动转为单元素数组,比如 [1].concat(2)[1, 2]
  • 展开运算符对类数组(如 argumentsNodeList)需先转成真数组,否则报错

删除元素:pop、shift、splice、filter 的适用边界

pop/shift 简单粗暴,改原数组、返回被删项;splice 是万能刀——可删、可替、可插,但容易误写索引和数量参数;filter 不改原数组,适合“逻辑删除”(按条件筛出新数组)。

  • splice(1, 1) 删除索引 1 处的 1 个元素;splice(1) 会删掉从索引 1 开始的所有元素(常被忽略)
  • filter 内部回调必须有明确返回值,return undefined 或没写 return 会导致该元素被过滤掉
  • 想清空数组?别用 arr = [](可能破坏引用),用 arr.length = 0arr.splice(0)

查找与判断:indexOf、includes、find、findIndex 的关键差异

indexOf 返回索引(找不到是 -1),只支持严格相等(===),对 NaN 失效;includes 返回布尔值,支持 NaNfindfindIndex 接收函数,用于复杂条件查找,且 find 找不到返回 undefined(不是 null)。

  • [NaN].indexOf(NaN)-1,但 [NaN].includes(NaN)true
  • find 找到第一个匹配项就停止,不遍历全部;若要找所有匹配项,用 filter
  • 对象数组中按属性查找,别用 indexOf(对象引用不同),改用 findIndex(item => item.id === 123)

遍历与转换:map、forEach、for...of、reduce 的取舍

map 生成新数组,适合“一对一”转换;forEach 仅执行副作用(如发请求、改 DOM),不返回值(返回 undefined);for...of 可中断(break/continue),支持异步;reduce 强大但易写错初始值,累加、扁平、分组都靠它。

  • map 中 return 缺失 → 新

    数组对应位置是 undefined
  • forEach 内部 async 函数不会等待,想串行请用 for...of + await
  • reduce 没传初始值时,第一次调用的 accumulator 是数组第 0 项,currentValue 是第 1 项 —— 空数组直接报错

真正难的不是记住每个方法的参数顺序,而是清楚「要不要改原数组」「要不要返回值」「是否需要中断」「是否涉及异步」——这些决策点卡住了大部分实际开发中的选择。