splice方法会直接修改原数组并返回被删除元素组成的数组;1. splice语法为array.splice(start, deletecount, item1, ...),start为起始索引,deletecount指定删除元素个数,后续参数为插入的新元素;2. splice与slice的核心区别在于splice是“修改者”会改变原数组,而slice是“复制者”不修改原数组仅返回新数组;3. splice常见应用场景包括根据索引删除、插入或替换元素,但存在修改原数组导致副作用、循环中删除元素需注意索引变化、性能开销较大等潜在问题;4. 现代javascript中更推荐使用filter()删除、展开运算符或concat()添加、map()修改元素,这些方法遵循不可变性原则,避免副作用,提升代码可预测性和可维护性,但在需原地修改或性能敏感场景下splice仍具价值。

splice
Array.prototype.splice()
array.splice(start, deleteCount, item1, item2, ...)
start
deleteCount
start
item1, item2, ...
start
它的核心魅力在于,无论你删除多少个元素,甚至一个都不删,它都会把那些“被移除”的元素(如果有的话)打包成一个新数组返回给你。这在很多场景下都非常有用,比如你需要知道哪些数据被移除了,以便进行后续处理。
示例:删除并获取删除项
let fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry'];
console.log('原始数组:', fruits); // 原始数组: ['apple', 'banana', 'cherry', 'date', 'elderberry']
// 从索引 2 开始,删除 2 个元素
let deletedFruits = fruits.splice(2, 2); 
console.log('删除后的数组:', fruits); // 删除后的数组: ['apple', 'banana', 'elderberry']
console.log('被删除的元素:', deletedFruits); // 被删除的元素: ['cherry', 'date']
// 尝试删除但只添加(deleteCount 为 0)
let numbers = [1, 2, 3, 4];
let addedItems = numbers.splice(2, 0, 99, 100); 
console.log('添加后的数组:', numbers); // 添加后的数组: [1, 2, 99, 100, 3, 4]
console.log('添加时被删除的元素 (空数组):', addedItems); // 添加时被删除的元素 (空数组): []splice
slice
这确实是个老生常谈的问题,我个人也经常看到开发者在两者之间摇摆,甚至我自己偶尔也会恍惚一下。核心原因在于它们的名字太像了,而且都和“切片”或“部分”有关。但它们的行为模式简直是天壤之别,理解了这一点,混淆就会大大减少。
简单来说,
splice
slice
想象一下,你有一块披萨:
splice
slice
所以,当你需要:
splice
slice
这种“原地修改”和“创建副本”的根本差异,是导致我们混淆的根源,也是我们选择它们时最关键的考量点。
splice
splice
常见的应用场景:
splice(index, 1)
let todos = ['学习JS', '写报告', '开会'];
let indexToRemove = 1; // 假设要删除“写报告”
let removedItem = todos.splice(indexToRemove, 1);
console.log(todos); // ['学习JS', '开会']
console.log('删除的事项:', removedItem[0]); // 删除的事项: 写报告let shoppingCart = ['牛奶', '面包']; shoppingCart.splice(1, 0, '鸡蛋'); // 在索引1处插入'鸡蛋',不删除任何元素 console.log(shoppingCart); // ['牛奶', '鸡蛋', '面包']
let settings = ['主题:亮色', '字体:小', '语言:英文']; settings.splice(0, 1, '主题:暗色'); // 将第一个元素替换为'主题:暗色' console.log(settings); // ['主题:暗色', '字体:小', '语言:英文']
push
pop
shift
unshift
splice
潜在的“坑”(Gotchas):
splice
splice
for
splice
let numbers = [1, 2, 3, 4, 5];
for (let i = 0; i < numbers.length; i++) {
    if (numbers[i] % 2 === 0) { // 如果是偶数就删除
        numbers.splice(i, 1);
        // i--; // 关键:删除后需要将索引减一,以检查新的当前位置的元素
    }
}
console.log(numbers); // 预期:[1, 3, 5],实际(不加i--):[1, 3, 5] (这个例子恰好对了,因为2被删,4前移到2的位置,i增加后跳过了4。如果删的是奇数,问题会更明显)
// 正确的做法通常是倒序遍历:
let numbersCorrect = [1, 2, 3, 4, 5];
for (let i = numbersCorrect.length - 1; i >= 0; i--) {
    if (numbersCorrect[i] % 2 === 0) {
        numbersCorrect.splice(i, 1);
    }
}
console.log(numbersCorrect); // [1, 3, 5]splice
deleteCount
deleteCount
splice
虽然
splice
删除元素:filter()
filter()
true
const users = [{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}, {id: 3, name: 'Charlie'}];
const updatedUsers = users.filter(user => user.id !== 2); // 移除id为2的用户
console.log(updatedUsers); // [{id: 1, name: 'Alice'}, {id: 3, name: 'Charlie'}]
console.log(users); // 原始数组未变:[{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}, {id: 3, name: 'Charlie'}]这比
splice
添加元素:展开运算符 (...
concat()
const originalArray = [1, 2, 3]; const newElement = 0; const addedAtBeginning = [newElement, ...originalArray]; // [0, 1, 2, 3] const addedAtEnd = [...originalArray, 4]; // [1, 2, 3, 4] const addedInMiddle = [originalArray[0], newElement, ...originalArray.slice(1)]; // 复杂一点,但可行 // 更常见的中间插入,可以结合slice const middleIndex = 1; const addedInMiddleSlice = [...originalArray.slice(0, middleIndex), 99, ...originalArray.slice(middleIndex)]; console.log(addedInMiddleSlice); // [1, 99, 2, 3]
concat()
const arr1 = [1, 2]; const arr2 = [3, 4]; const combined = arr1.concat(arr2); // [1, 2, 3, 4]
修改/替换元素:map()
map()
const products = [{id: 1, price: 10}, {id: 2, price: 20}];
const updatedProducts = products.map(product => 
    product.id === 1 ? { ...product, price: 15 } : product // 修改id为1的产品的价格
);
console.log(updatedProducts); // [{id: 1, price: 15}, {id: 2, price: 20}]
console.log(products); // 原始数组未变这些方法之所以被称为“更优雅”,很大程度上是因为它们遵循了函数式编程中“不可变性”的原则。这意味着每次操作都会返回一个新数组,而不会触碰旧数组,这使得数据流向更清晰,调试更简单,尤其是在大型、复杂的状态管理应用中,能有效避免难以预料的副作用。当然,这并不是说
splice
splice
以上就是js 怎样用splice修改数组内容并返回删除项的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                
                                
                                
                                
                                
                                
                                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号