高频必会且易错的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()(虽也能用,但意图不明确)。
立即学习“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)
真正难的不是记方法名,而是每次调用前下意识问一句:“这个操作会改原数组吗?”“我需要的是新数组还是原始索引?”—— 多问两次,调试时间少一半。