可变vs不可变
在JavaScript中,可变操作指直接修改原始数据结构。例如:
const arr = [1, 2, 3];
arr.push(4);
console.log(arr);
不可变方法返回新的数据结构
const arr = [1, 2, 3];
const newArr = [...arr, 4];
console.log(arr);
console.log(newArr);
虽然可能带来一些性能开销,但能够提高代码的可预测性和可维护性。
slice vs splice
假设我们正在开发一个待办事项列表应用,需要实现移除已完成任务的功能:
function removeCompletedTasks(tasks) {
for (let i = tasks.length - 1; i >= 0; i--) {
if (tasks[i].completed) {
tasks.splice(i, 1);
}
}
return tasks;
}
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(): 安全访问数组元素
const fruits = ['苹果', '香蕉', '橙子'];
console.log(fruits.at(-1));
2. with(): 不可变地更新数组元素
const updatedFruits = fruits.with(1, '葡萄');
console.log(fruits);
console.log(updatedFruits);
3. toSorted(): 不可变排序
const numbers = [3, 1, 4, 1, 5, 9];
const sortedNumbers = numbers.toSorted();
console.log(numbers);
console.log(sortedNumbers);