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

Especificação
ECMAScript (ECMA-262)
The definition of 'Array.prototype.slice' in that specification.

Compatibilidade

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
sliceChrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 4Opera Full support 4Safari Full support 1WebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support 10.1Safari iOS Full support 1Samsung Internet Android Full support 1.0nodejs Full support 0.1.100

Legend

Full support  
Full support

Veja também