高频必会且易错的JavaScript数组方法中,push()、pop()、shift()、unshift()、splice()、reverse()、sort()会直接修改原数组;map()、filter()、reduce()不修改原数组,返回新数组或值;浅拷贝推荐[...arr],查元素优先用includes(),对象数组查字段用some()。

JavaScript 数组方法很多,但真正日常开发中高频、必会、且容易出错的其实就那几个——掌握它们比背全 API 更重要。
哪些方法会直接修改原数组(mutating)?
这是最容易踩坑的地方:你以为生成了新数组,结果原数据被改了,后续逻辑全乱。
-
push()、pop()、shift()、unshift():增删首尾元素,返回新长度或被删值,原数组变 -
splice():万能修改器(增、删、替),返回被删元素数组,原数组变 —— 尤其注意它和slice()拼写只差一个 p,行为天壤之别 -
reverse()、sort():连顺序都给你翻过来或重排,原数组变 ——sort()默认按字符串排序,[10, 2, 1]会变成[1, 10, 2],必须传(a, b) => a - b
map()、filter()、reduce() 为什么几乎必用?
它们不改原数组,返回新数组/值,天然适配函数式思维和 React/Vue 等框架的数据不可变要求。
-
map():一对一转换,比如arr.map(x => x * 2);别用它来“遍历执行副作用”,那是forEach()的事 -
filter():返回满足条件的元素,注意返回值是布尔值,不是元素本身 ——arr.filter(x => x > 5),不是arr.filter(x => return x > 5) -
reduce():聚合计算,初学者常卡在累加器(acc)初始值上 —— 求和要写arr.reduce((sum, x) => sum + x, 0),缺了, 0遇到空数组会报错
如何安全地“复制”一个数组?
浅拷贝就够了的场景下,别再用 arr.slice(0) 这种老写法,可读性差还容易误写成 slice()(虽也能用,但意图不明确)。
十天学会易语言图解教程用图解的方式对易语言的使用方法和操作技巧作了生动、系统的讲解。需要的朋友们可以下载看看吧!全书分十章,分十天讲完。 第一章是介绍易语言的安装,以及运行后的界面。同时介绍一个非常简单的小程序,以帮助用户入门学习。最后介绍编程的输入方法,以及一些初学者会遇到的常见问题。第二章将接触一些具体的问题,如怎样编写一个1+2等于几的程序,并了解变量的概念,变量的有效范围,数据类型等知识。其后,您将跟着本书,编写一个自己的MP3播放器,认识窗口、按钮、编辑框三个常用组件。以认识命令及事件子程序。第
立即学习“Java免费学习笔记(深入)”;
- 推荐
[...arr](展开语法):简洁、直观、支持嵌套解构 - 次选
Array.from(arr):兼容旧环境,还能顺便做映射,比如Array.from(arr, x => x * 2) - 警惕
arr.concat():不传参时等价于浅拷贝,但语义模糊,新人看不懂;传空数组反而画蛇添足 - 深拷贝?别用
JSON.parse(JSON.stringify(arr))—— 丢函数、undefined、Date、RegExp,且循环引用直接崩
查元素用 includes() 还是 indexOf()?
二者用途不同,混用会导致 bug。
- 只需判断存不存在 → 用
arr.includes(value),返回true/false,语义清晰,还支持NaN(indexOf(NaN)永远返回-1) - 需要知道位置或进一步操作(比如删掉它)→ 用
arr.indexOf(value),返回索引,找不到是-1 - 对象数组查某字段?别硬套
includes()—— 它用的是严格相等(===),两个字面量对象永远不等;改用some():arr.some(item => item.id === targetId)
真正难的不是记方法名,而是每次调用前下意识问一句:“这个操作会改原数组吗?”“我需要的是新数组还是原始索引?”—— 多问两次,调试时间少一半。










