我最近在写一些简明的 Web 前端开发教程。这篇文章的标题或许应该是“怎么才能不混淆 JavaScript 数组中的 Slice 方法和 Splice 方法”,因为我自己总是记不住这两者的区别。

希望这个解释可以帮我自己理解,也帮到你:

S (p) lice = Slice + (p) => Slice + in (p) lace

Array.prototype.slice()

Array.prototype.slice() 是用于提取一个数组,从  start 元素到 end  元素(不包含 end 元素)。

其实可以从这个方法的名字看出来,它是用于从一个 JavaScript 数组中提取元素。不过和切蛋糕不同,从数组中提取元素不会影响原数组,原数组根本就不会变化(像是切不完的蛋糕!)

arr.slice(start, [end])

要点:

1、返回新数组,而原数组保持不变

2、如果没有指定 end 元素,那么切分的数组包含从 start 到数组结束的所有元素

3、如果  start 元素是负数,那就从数组尾部算起,-1 是指最后一个元素

const infiniteCake = ['🍰','🍰','🍰','🍰','🍰','🍰']

let myPieceOfCake = infiniteCake.slice(0,1) // ['🍰']
let yourDoublePieceOfCake = infiniteCake.slice(0,2) // (2) ["🍰", "🍰"]
console.log(infiniteCake) //['🍰','🍰','🍰','🍰','🍰','🍰']

可以看到,原数组  inifinteCake 保持不变。

Array.prototype.splice()

Splice 方法为原数组添加或者删除元素,返回被删除的元素,也就是说它会改变原数组。

这是真正意义上的“切蛋糕”。

arr.splice(start, [deleteCount, itemToInsert1, itemToInsert2, ...])

要点:

1、返回一个数组,包含被删除的元素

2、如果  start 元素是负数,那就从数组尾部算起,-1 是指最后一个元素

3、如果没有指定 deleteCount,则删除至原数组尾部

4、如果没有指定 itemToInsert1,则不向原数组添加元素

const cake = ['🍰','🍰','🍰','🍰','🍰','🍰'];
let myPieceOfCake = cake.splice(0, 1) // ["🍰"]
console.log(cake) // (5) ["🍰", "🍰", "🍰", "🍰", "🍰"]

let yourDoublePieceOfCake = cake.splice(0,2) //(2) ["🍰", "🍰"]
console.log(cake) //(3) ["🍰", "🍰", "🍰"]

如上, cake 数组被修改了,元素减少了。

代码示例

const myArray  = [1,2,3,4,5,6,7] 

console.log(myArray.slice(0))       // [ 1, 2, 3, 4, 5, 6, 7 ]
console.log(myArray.slice(0, 1))    // [ 1 ]
console.log(myArray.slice(1))       // [ 2, 3, 4, 5, 6, 7 ]
console.log(myArray.slice(5))       // [ 6, 7 ]
console.log(myArray.slice(-1))      // [ 7 ]
console.log(myArray)                // [ 1, 2, 3, 4, 5, 6, 7 ]



const secondArray = [10, 20, 30, 40, 50]

console.log(secondArray.splice(0, 1))   // [ 10 ] : deletes 1 element starting at index 0
console.log(secondArray.splice(-2, 1))  // [ 40 ] : deletes 1 element starting at index end-2 
console.log(secondArray)                // [ 20, 30, 50 ]
console.log(secondArray.splice(0))      // [ 20, 30, 50 ] : deletes all elements starting at index 0
console.log(secondArray)                // []
console.log(secondArray.splice(2, 0, 60, 70)) // [] : deletes 0 elements starting at index 2 (doesn't exist so defaults to 0) and then inserts 60, 70
console.log(secondArray)                // [60, 70]

小结

如果需要改变原数组,或者为原数组增加元素,用 splice

如果只是删除元素,而不改变原数组,用 slice

原文:JavaScript Array Slice vs Splice: the Difference Explained with Cake,作者:Shruti Kapoor