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

JavaScript 数组的常用操作方法不是靠死记,而是按「增删改查 + 遍历 + 转换」这几类场景来理解最稳。下面挑真正高频、易错、有坑的说。
添加元素:push、unshift、concat 和展开运算符的区别
push 和 unshift 直接修改原数组,前者尾部加、后者头部加,都返回新长度;concat 不改原数组,但只浅合并,遇到嵌套数组不会递归扁平;更推荐用展开运算符 [...arr, newItem] 或 [newItem, ...arr],语义清晰、不可变、兼容性好(ES2015+)。
-
push性能优于unshift(后者要移动所有已有元素) -
concat传入对象或原始值时会自动转为单元素数组,比如[1].concat(2)→[1, 2] - 展开运算符对类数组(如
arguments、NodeList)需先转成真数组,否则报错
删除元素:pop、shift、splice、filter 的适用边界
pop/shift 简单粗暴,改原数组、返回被删项;splice 是万能刀——可删、可替、可插,但容易误写索引和数量参数;filter 不改原数组,适合“逻辑删除”(按条件筛出新数组)。
-
splice(1, 1)删除索引 1 处的 1 个元素;splice(1)会删掉从索引 1 开始的所有元素(常被忽略) -
filter内部回调必须有明确返回值,return undefined或没写return会导致该元素被过滤掉 - 想清空数组?别用
arr = [](可能破坏引用),用arr.length = 0或arr.splice(0)
查找与判断:indexOf、includes、find、findIndex 的关键差异
indexOf 返回索引(找不到是 -1),只支持严格相等(===),对 NaN 失效;includes 返回布尔值,支持 NaN;find 和 findIndex 接收函数,用于复杂条件查找,且 find 找不到返回 undefined(不是 null)。
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
立即学习“Java免费学习笔记(深入)”;
-
[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 项 —— 空数组直接报错
真正难的不是记住每个方法的参数顺序,而是清楚「要不要改原数组」「要不要返回值」「是否需要中断」「是否涉及异步」——这些决策点卡住了大部分实际开发中的选择。










