Array.prototype.slice()

O método slice() devolve uma cópia rasa (é feita uma cópia dos pointers se for um objeto) de uma parte de uma matriz num novo objeto de array selecionado do start (início incluído) ao end (fim excluído) onde o start e o end representam o índice de itens dessa matriz. A matriz original não é modificada.

Sintaxe

arr.slice([start[, end]])

Parâmetros

start Optional
Indice de base zero, onde coméça a cópia.
Um índice negativo pode ser utilizado, indicando um intervalo a partir do fim da sequência. slice(-2) extrai os dois últimos elementos da sequência.
Se start é undefined, slice coméça a partir do indice 0.
Se start é maior que o último índice da sequência, uma matriz vazia é devolvida.
end Optional
Índice antes do qual se deve terminar a extração. slice extrai até o valor de indice end, mas sem incluir end. Por exemplo, slice(1,4) extrai do segundo até ao quarto elemento (elementos indexados 1, 2, e 3).
Pode ser utilizado um índice negativo, indicando o último índice a partir do fim da sequência. slice(2,-1) extrai do terceiro até ao penúltimo elemento na sequência.
Se end é omisso, slice extrai todos os elementos até ao fim da sequência (arr.length).
Se end é maior que o comprimento da sequência, slice extrai todos os elementos até ao fim da sequência (arr.length).

Resultado

Uma matriz nova contendo os elementos extraídos.

Descrição

slice não altera a matriz original. Devolve uma cópia rasa dos elementos da matriz original. Os elementos da matriz original são copiados para a matriz devolvida como se segue:

  • Para referências de objectos (e não o objecto real), slice copia as referências de objectos para a nova matriz. Tanto o original como a nova matriz referem-se ao mesmo objecto. Se um objecto referenciado mudar, as mudanças são visíveis tanto para a nova matriz como para a original.
  • Para strings, números e booleanos (não String, Number e Booleano objetos), slice copia os valores para a nova matriz. Alterações à string, número, ou booleano numa matriz não afetam a outra matriz.

Se um novo elemento é adicionado a qualquer das matrizes, a outra matriz não é afetada.

Exemplos

Devolver uma porção duma matriz

let fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango']
let citrus = fruits.slice(1, 3)

// fruits contêm ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango']
// citrus contêm ['Orange','Lemon']

Usar slice

No seguinte exemplo, slice cria uma array (matriz), newCar, a partir de myCar. Ambos incluem uma referência ao objeto myHonda. Quando a propriedade color (cor) de myHonda é mudada para purple (roxo), ambas matrizes refletem a alteração.

// Usando slice, cria newCar a partir de myCar.
let myHonda = { color: 'red', wheels: 4, engine: { cylinders: 4, size: 2.2 } }
let myCar = [myHonda, 2, 'cherry condition', 'purchased 1997']
let newCar = myCar.slice(0, 2)

// Imprime os valors de myCar, newCar, a propriadade
// color de myHonda em ambas arrays.
console.log('myCar = ' + JSON.stringify(myCar))
console.log('newCar = ' + JSON.stringify(newCar))
console.log('myCar[0].color = ' + myCar[0].color)
console.log('newCar[0].color = ' + newCar[0].color)

// Mude a propriadade color de myHonda.
myHonda.color = 'purple'
console.log('A nova cor de my Honda é ' + myHonda.color)

// Imprime a propriadade color de myHonda em ambas arrays.
console.log('myCar[0].color = ' + myCar[0].color)
console.log('newCar[0].color = ' + newCar[0].color)

Este script imprime:

myCar = [{color: 'red', wheels: 4, engine: {cylinders: 4, size: 2.2}}, 2,
         'cherry condition', 'purchased 1997']
newCar = [{color: 'red', wheels: 4, engine: {cylinders: 4, size: 2.2}}, 2]
myCar[0].color = red
newCar[0].color = red
A nova cor de my Honda é purple
myCar[0].color = purple
newCar[0].color = purple

Objetos parecidos com Array

O método slice tembém pode ser chamado para converter objetos / coleções do estilo matriz para um objeto Array. É só preciso bind o método ao objeto. Os argumentos dentro da função são um exemplo de um "objeto de estilo matriz".

function list() {
  return Array.prototype.slice.call(arguments)
}

let list1 = list(1, 2, 3) // [1, 2, 3]

Binding pode ser feito com o método call() de Function.prototype e também pode ser simplificado a usar  [].slice.call(arguments) invés de Array.prototype.slice.call.

Pode ser simplificado a usar bind.

let unboundSlice = Array.prototype.slice
let slice = Function.prototype.call.bind(unboundSlice)

function list() {
  return slice(arguments)
}

let list1 = list(1, 2, 3) // [1, 2, 3]

Especificações

Compatibilidade

BCD tables only load in the browser

Veja também