javascript数组不可变操作需避免修改原数组,改用扩展运算符、concat、map、filter、slice等返回新数组的方法,并注意浅拷贝限制,必要时结合structuredclone或immer等工具实现深不可变。
javascript 数组默认是可变的,但通过避免直接修改原数组、始终返回新数组,就能实现不可变操作。核心是用纯函数式方法替代 push、pop、splice 等会改变原数组的方法。
用扩展运算符和 concat 创建新数组
这是最常用也最直观的方式,适合添加、合并元素。
-
添加元素:不用
push(),改用[...arr, newItem]或arr.concat(newItem) -
合并数组:用
[...arr1, ...arr2]替代arr1.push(...arr2) -
注意:扩展运算符只做浅拷贝,嵌套对象仍共享引用;如需深不可变,需配合结构克隆(如
structuredClone或第三方库)
用 map、filter、slice 替代原地修改方法
这些方法天然返回新数组,不改变原数组,是不可变编程的主力工具。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
修改每个元素:用
arr.map(x => x * 2)代替arr.forEach((x, i) => arr[i] = x * 2) -
筛选元素:用
arr.filter(x => x > 5)代替arr.splice()或循环delete -
截取片段:用
arr.slice(1, 4)代替arr.splice(1, 3)(后者会改原数组)
安全更新特定位置的元素
想“替换第 i 个元素”时,不能直接赋值 arr[i] = newValue,而应构造新数组。
- 通用写法:
[...arr.slice(0, i), newValue, ...arr.slice(i + 1)] - 更清晰的封装:
arr.map((x, idx) => idx === i ? newValue : x) - 对对象数组更新字段,也可组合使用:
users.map(u => u.id === targetId ? {...u, name: 'New'} : u)
借助现代 API 和轻量工具增强表达力
某些场景下原生方法不够简洁,可用少量辅助提升可读性与安全性。
-
toSorted()、toReversed()、with()(ES2023+):返回新数组,如arr.with(2, 'new')相当于替换索引 2 的值 - 简单封装常用操作:
const insert = (arr, index, item) => [...arr.slice(0, index), item, ...arr.slice(index)] - 如项目复杂度高,可引入
immer(自动代理不可变更新)或lodash/fp(函数式工具集),但多数场景原生已足够
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










