




高频必会且易错的JavaScript数组方法中,push()、pop()、shift()、unshift()、splice()、reverse()、sort()会直接修改原数组;map()、filter()、reduce()不修改原数组,返回新数组或值;浅拷贝推荐[...arr],查元素优先用includes(),对象数组查字段用some()。
JavaScript 数组方法很多,但真正日常开发中高频、必会、且容易出错的其实就那几个——掌握它们比背全 API 更重要。
这是最容易踩坑的地方:你以为生成了新数组,结果原数据被改了,后续逻辑全乱。
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()(虽也能用,但意图不明确)。
[...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(val
ue),返回 true/false,语义清晰,还支持 NaN(indexOf(NaN) 永远返回 -1)arr.indexOf(value),返回索引,找不到是 -1
includes() —— 它用的是严格相等(===),两个字面量对象永远不等;改用 some():arr.some(item => item.id === targetId)
真正难的不是记方法名,而是每次调用前下意识问一句:“这个操作会改原数组吗?”“我需要的是新数组还是原始索引?”—— 多问两次,调试时间少一半。