Esta tradução está incompleta. Ajude atraduzir este artigo.
O método slice()
retorna uma cópia rasa de parte de um array em um novo objeto array.
Syntaxe
arr.slice([begin[, end]])
Parâmetros
begin
- Índice Zero-based no qual se inicia a extração.
- Como um índice negativo,
begin
indica um deslocamento em relação ao fim da sequência.slice(-2)
extrai os dois últimos elementos da sequência. - Se
begin
for omitido,slice
inicia a partir do índice 0. end
- Índice baseado em zero (origem iniciando em zero) o qual é o final da extração.
slice
extrai até, não incluindoend
. slice(1,4)
extrai do segundo até o quarto elemento (elementos de índice 1, 2 e 3).- Como índice negativo, end indica um deslocamento em relação ao fim da sequência.
slice(2,-1)
extrai o terceiro elemento através do segundo-para-o-último elemento na sequência. - Se
end
for omitido,slice
extrairá o fim da sequência (arr.length
).
Descrição
slice
não altera. Retorna uma cópia de elementos do array original. Elementos do array original são copiados para o array retornado da seguinte maneira:
- Para referências de objeto (e não o objeto real),
slice
copia referencias de objeto em um novo array. Ambos, o original e o novo array referem-se ao mesmo objeto. Se um objeto referenciado é alterado, as alterações são visiveis em ambos, no novo array e no array original. - Para strings e números (não objetos
String
eNumber
),slice
copia strings e números em um novo array. Alterações na string ou número em um array não afetam o outro array.
Se um novo elemento é adicionado a qualquer array, o outro não é afetado.
Exemplos
Retorna uma parte de um array existente
// Exemplo extrair nossos bons amigos, os cítricos, das frutas var frutas = ['Banana', 'Laranja', 'Limao', 'Maçã', 'Manga']; var citricos = frutas.slice(1, 3); // citricos contem ['Laranja','Limao']
Usando slice
No exemplo seguinte, slice
cria um novo array, novoCarro
, from meuCarro
. Ambos incluem uma referência ao objeto, meuHonda
. Quando a cor de meuHonda
é alterada para roxo, ambos os arrays sofrem alteração.
// Usando slice para criar novoCarro a partir de meuCarro. var meuHonda = { cor: 'vermelho', rodas: 4, motor: { cilindros: 4, tamanho: 2.2 } }; var meuCarro = [meuHonda, 2, 'perfeitas condições', 'comprado em 1997']; var novoCarro = meuCarro.slice(0, 2); // Exibe os valores de meuCarro, novoCarro, e a cor de meuHonda // referenciado de ambos arrays. console.log('meuCarro = ' + meuCarro.toSource()); console.log('novoCarro = ' + novoCarro.toSource()); console.log('meuCarro[0].cor = ' + meuCarro[0].cor); console.log('novoCarro[0].cor = ' + novoCarro[0].cor); // Altera a cor de meuHonda. meuHonda.cor= 'roxo'; console.log('A nova cor do meu Honda é ' + meuHonda.cor); // Exibe a cor de meuHonda referenciado de ambos arrays. console.log('meuCarro[0].cor = ' + meuCarro[0].cor); console.log('novoCarro[0].cor = ' + novoCarro[0].cor);
Esse script escreve:
meuCarro = [{cor:'vermelho', rodas:4, motor:{cilindros:4, tamanho:2.2}}, 2,'perfeitas condições', 'comprado em 1997'] novoCarro = [{cor:'vermelho', rodas:4, motor:{cilindros:4, tamanho:2.2}},2] meuCarro[0].cor = vermelho novoCarro[0].cor = vermelho A nova cor do meu Honda é roxo meuCarro[0].cor = roxo novoCarro[0].cor = roxo
Array-like objects
slice
method can also be called to convert Array-like objects / collections to a new Array. You just bind the method to the object. The arguments
inside a function is an example of an 'array-like object'.
function list() { return Array.prototype.slice.call(arguments); } var list1 = list(1, 2, 3); // [1, 2, 3]
Binding can be done with the .call
function of Function.prototype
and it can also be reduced using [].slice.call(arguments)
instead of Array.prototype.slice.call
. Anyway, it can be simplified using bind
.
var unboundSlice = Array.prototype.slice; var slice = Function.prototype.call.bind(unboundSlice); function list() { return slice(arguments); } var list1 = list(1, 2, 3); // [1, 2, 3]
Streamlining cross-browser behavior
Although host objects (such as DOM objects) are not required by spec to follow the Mozilla behavior when converted by Array.prototype.slice
and IE < 9 does not do so, versions of IE starting with version 9 do allow this, “shimming” it can allow reliable cross-browser behavior. As long as other modern browsers continue to support this ability, as currently do IE, Mozilla, Chrome, Safari, and Opera, developers reading (DOM-supporting) slice code relying on this shim will not be misled by the semantics; they can safely rely on the semantics to provide the now apparently de facto standard behavior. (The shim also fixes IE to work with the second argument of slice()
being an explicit null
/undefined
value as earlier versions of IE also did not allow but all modern browsers, including IE >= 9, now do.)
/** * Shim for "fixing" IE's lack of support (IE < 9) for applying slice * on host objects like NamedNodeMap, NodeList, and HTMLCollection * (technically, since host objects have been implementation-dependent, * at least before ES6, IE hasn't needed to work this way). * Also works on strings, fixes IE < 9 to allow an explicit undefined * for the 2nd argument (as in Firefox), and prevents errors when * called on other DOM objects. */ (function () { 'use strict'; var _slice = Array.prototype.slice; try { // Can't be used with DOM elements in IE < 9 _slice.call(document.documentElement); } catch (e) { // Fails in IE < 9 // This will work for genuine arrays, array-like objects, // NamedNodeMap (attributes, entities, notations), // NodeList (e.g., getElementsByTagName), HTMLCollection (e.g., childNodes), // and will not fail on other DOM objects (as do DOM elements in IE < 9) Array.prototype.slice = function(begin, end) { // IE < 9 gets unhappy with an undefined end argument end = (typeof end !== 'undefined') ? end : this.length; // For native Array objects, we use the native slice function if (Object.prototype.toString.call(this) === '[object Array]'){ return _slice.call(this, begin, end); } // For array like object we handle it ourselves. var i, cloned = [], size, len = this.length; // Handle negative value for "begin" var start = begin || 0; start = (start >= 0) ? start : Math.max(0, len + start); // Handle negative value for "end" var upTo = (typeof end == 'number') ? Math.min(end, len) : len; if (end < 0) { upTo = len + end; } // Actual expected size of the slice size = upTo - start; if (size > 0) { cloned = new Array(size); if (this.charAt) { for (i = 0; i < size; i++) { cloned[i] = this.charAt(start + i); } } else { for (i = 0; i < size; i++) { cloned[i] = this[start + i]; } } } return cloned; }; } }());
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript 3rd Edition (ECMA-262) | Standard | Initial definition. Implemented in JavaScript 1.2. |
ECMAScript 5.1 (ECMA-262) The definition of 'Array.prototype.slice' in that specification. |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Array.prototype.slice' in that specification. |
Standard |
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 1.0 | 1.0 (1.7 or earlier) | (Yes) | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |