javaScript 数据结构可变性和不可变性

可变vs不可变

在JavaScript中,可变操作指直接修改原始数据结构。例如:
js 复制代码
const arr = [1, 2, 3];
arr.push(4); // 可变操作
console.log(arr); // 输出: [1, 2, 3, 4]

不可变方法返回新的数据结构

js 复制代码
const arr = [1, 2, 3];
const newArr = [...arr, 4]; // 不可变操作
console.log(arr);     // 输出: [1, 2, 3]
console.log(newArr);  // 输出: [1, 2, 3, 4]
虽然可能带来一些性能开销,但能够提高代码的可预测性和可维护性。

slice vs splice

假设我们正在开发一个待办事项列表应用,需要实现移除已完成任务的功能:
js 复制代码
// 使用splice (可变方法)
function removeCompletedTasks(tasks) {
  for (let i = tasks.length - 1; i >= 0; i--) {
    if (tasks[i].completed) {
      tasks.splice(i, 1);
    }
  }
  return tasks;
}

// 使用slice (不可变方法)
function removeCompletedTasksImmutable(tasks) {
  return tasks.filter(task => !task.completed);
}

const tasks = [
  { id: 1, text: "周一", completed: false },
  { id: 2, text: "周二", completed: true },
  { id: 3, text: "周三", completed: false }
];

console.log(removeCompletedTasks([...tasks]));
console.log(removeCompletedTasksImmutable(tasks));
在这个例子中,splice方法直接修改原数组,而filter方法(基于slice的思想)创建一个新数组。不可变方法通常更受欢迎,因为它们有助于优化渲染性能。

现代方法:at(), with(), 和 toSorted()

1. at(): 安全访问数组元素
js 复制代码
const fruits = ['苹果', '香蕉', '橙子'];
console.log(fruits.at(-1)); // 输出: '橙子'
2. with(): 不可变地更新数组元素
js 复制代码
const updatedFruits = fruits.with(1, '葡萄');
console.log(fruits);         // 输出: ['苹果', '香蕉', '橙子']
console.log(updatedFruits);  // 输出: ['苹果', '葡萄', '橙子']
3. toSorted(): 不可变排序
js 复制代码
const numbers = [3, 1, 4, 1, 5, 9];
const sortedNumbers = numbers.toSorted();
console.log(numbers);        // 输出: [3, 1, 4, 1, 5, 9]
console.log(sortedNumbers);  // 输出: [1, 1, 3, 4, 5, 9]
相关推荐
daxiangxm16 分钟前
GEO策略:让AI直接引用你的内容
开发语言·团队开发·运维开发·个人开发·数据库开发
泡海椒27 分钟前
JQuick-Excel 实战:用 VALIDATION 建立可维护的 Excel 导入校验
开发语言·python·excel
longlongzihan31 分钟前
前缀积与后缀积 —— LeetCode 238. 除了自身以外数组的乘积
开发语言·c++·leetcode
All for pursuit.35 分钟前
【动态规划-1】121.买卖股票的最佳时机
数据结构·c++·算法·leetcode·动态规划
szial44 分钟前
JavaScript 的 call、apply 和 bind:如何控制函数调用
开发语言·前端·javascript
weixin_307779131 小时前
C++代码实现MATLAB中的cvpartition函数功能
开发语言·c++·算法·matlab
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出优秀项目组中的“独特编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
黑妹天下第一乖1 小时前
小智改造实战解读-首 token 延迟去哪了:云端与端侧大模型的分段对照
开发语言·人工智能·python·嵌入式硬件·自然语言处理·iot
。小二1 小时前
Go 泛型并发利刃:async 库深度评测——370K ops/s、零依赖、生产就绪
开发语言·javascript·golang
(Charon)1 小时前
【C++面试】线程同步机制:互斥锁、条件变量、原子操作与读写锁
开发语言·c++·算法·面试