[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Spread_syntax [Back]  [Original]

Sintaxe de Espalhamento - JavaScript | MDN

Esta pgina foi traduzida do ingls pela comunidade. Saiba mais e junte-se comunidade MDN Web Docs.

View in English Always switch to English

Sintaxe de Espalhamento

Baseline Widely available

This feature is well established and works across many devices and browser versions. Its been available across browsers since outubro de 2015.

Sintaxe de Espalhamento (Spread syntax) permite que um objeto itervel, como uma expresso de array ou uma string seja expandido para ser usado onde zero ou mais argumentos (para chamadas de funes) ou elementos (para arrays literais) so esperados, ou que um objeto seja expandido onde zero ou mais pares propriedade:valor (para objetos literais) so esperados.

In this article

Experimente

function sum(x, y, z) {
  return x + y + z;
}

const numbers = [1, 2, 3];

console.log(sum(...numbers));
// Expected output: 6

console.log(sum.apply(null, numbers));
// Expected output: 6

Sintaxe

Para chamada de funes:

myFunction(...iterableObj);

Para arrays literais ou strings:

[...iterableObj, '4', 'five', 6];

Para objetos literais (novo em ECMAScript 2018; stage 3 draft):

let objClone = { ...obj };

Exemplos

Espalhamento e chamadas de funes

Substituindo apply

comum usar Function.prototype.apply em casos onde voc quer usar os elementos de um array como argumentos para uma funo.

js
function myFunction(x, y, z) {}
var args = [0, 1, 2];
myFunction.apply(null, args);

Com a sintaxe de espalhamento, o cdigo acima pode ser escrito assim:

js
function myFunction(x, y, z) {}
var args = [0, 1, 2];
myFunction(...args);

Qualquer argumento numa lista de argumentos pode usar a sintaxe de espalhamento e pode ser usado mais de uma vez.

js
function myFunction(v, w, x, y, z) {}
var args = [0, 1];
myFunction(-1, ...args, 2, ...[3]);

Apply para new

Quando um construtor chamado com new, no possivel usar diretamente um array e apply (apply executa o [[Call]] e no o [[Construct]]). No entanto, um array pode facilmente ser usado com new graas ao operador de espalhamento:

js
var dateFields = [1970, 0, 1]; // 1 Jan 1970
var d = new Date(...dateFields);

Para usar o new com array de parmetros sem a sintaxa de espalhamento, voc teria que fazer isso indiretamente por meio da aplicao parcial:

js
function applyAndNew(constructor, args) {
  function partial() {
    return constructor.apply(this, args);
  }
  if (typeof constructor.prototype === "object") {
    partial.prototype = Object.create(constructor.prototype);
  }
  return partial;
}

function myConstructor() {
  console.log("arguments.length: " + arguments.length);
  console.log(arguments);
  this.prop1 = "val1";
  this.prop2 = "val2";
}

var myArguments = ["hi", "how", "are", "you", "mr", null];
var myConstructorWithArguments = applyAndNew(myConstructor, myArguments);

console.log(new myConstructorWithArguments());
// (internal log of myConstructor):           arguments.length: 6
// (internal log of myConstructor):           ["hi", "how", "are", "you", "mr", null]
// (log of "new myConstructorWithArguments"): {prop1: "val1", prop2: "val2"}

Espalhamento em arrays literais

Um array literal mais poderoso

Criar um novo array usando um array existente como parte dele, no possvel utilizando apenas a sintaxe de array literal. O cdigo imperativo deve ser usado ao invs da combinao de push, splice, concat, etc. Com a sintaxe de espalhamento isso se torna muito mais sucinto:

js
var parts = ["shoulders", "knees"];
var lyrics = ["head", ...parts, "and", "toes"];
// ["head", "shoulders", "knees", "and", "toes"]

Assim como espalhar a lista de argumentos, ... pode ser usado em qualquer lugar em um array literal e pode ser usado multiplas vezes.

Copiando um array

js
var arr = [1, 2, 3];
var arr2 = [...arr]; // like arr.slice()
arr2.push(4);

// arr2 becomes [1, 2, 3, 4]
// arr remains unaffected

Nota: A sintaxe de espalhamento efetivamente vai um nvel mais profundo quando se copia um array. Assim sendo, pode ser inadequado para copiar arrays multidimensionais como o exemplo a seguir mostra ( o mesmo com Object.assign() e a sintaxe de espalhamento).

js
var a = [[1], [2], [3]];
var b = [...a];
b.shift().shift(); // 1
// Now array a is affected as well: [[], [2], [3]]

Uma maneira melhor de concatenar arrays

Array.concat frequentemente usado para concatenar um array no final de um array existente. Sem a sintaxe de espalhamento feito assim:

js
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
// Append all items from arr2 onto arr1
arr1 = arr1.concat(arr2);

Com a sintaxe de espalhamento se torna isso:

js
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr1 = [...arr1, ...arr2];

Array.unshift frequentemente usado para inserir um array de valores no inicio de um array existente. Sem a sintaxe de espalhamento feito assim:

js
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
// Prepend all items from arr2 onto arr1
Array.prototype.unshift.apply(arr1, arr2); // arr1 is now [3, 4, 5, 0, 1, 2]

Com a sintaxe de espalhamento isso se torna [Note, no entanto, que isso cria um novo arr1 array. Ao contrrio de Array.unshift, isso no modifica o array original arr1 array]:

js
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr1 = [...arr2, ...arr1]; // arr1 is now [3, 4, 5, 0, 1, 2]

Espalhamento em objetos literais

A proposta Rest/Spread Properties for ECMAScript (stage 3) adiciona espalhamento de propriedades para objetos literais. Este copia as propriedades enumerveis de um objeto informado em um novo objeto.

Cpia-rasa (Shallow-cloning) (excluindo o prottipo) ou fuso (merge) de objetos agora possivel usando uma sintaxe mais curta que Object.assign().

js
var obj1 = { foo: "bar", x: 42 };
var obj2 = { foo: "baz", y: 13 };

var clonedObj = { ...obj1 };
// Object { foo: "bar", x: 42 }

var mergedObj = { ...obj1, ...obj2 };
// Object { foo: "baz", x: 42, y: 13 }

Note que Object.assign() chamada os setters e a sintaxe de espalhamento no.

Apenas para iterveis

A sintaxe de espalhamento (diferente de propriedades espalhadas) s pode ser utilizada com objetos iterveis.

js
var obj = { key1: "value1" };
var array = [...obj]; // TypeError: obj is not iterable

Espalhamento com muitos valores

Quando usar a sintaxe de espalhamento para chamada de funes, esteja ciente da possibilidade de exceder tamanho mximo de argumentos do motor do Javascript. Veja apply() para mais detalhes.

Sintaxe Rest (parmetros)

A sintaxe rest se parece exatamente como a sintaxe de espalhamento, mas esta usada para desestruturar arrays e objetos. De certa forma, a sintaxe rest o oposto da sintaxe de espalhamento: A sintaxe de espalhamento (spread) 'expande' um array em vrios elementos, enquanto a sintaxe rest coleta multiplos elementos e 'condensa' eles em um nico elemento. Veja parmetros rest.

Especificaes

Specification
ECMAScript 2027 LanguageSpecification
# prod-SpreadElement
ECMAScript 2027 LanguageSpecification
# prod-ArgumentList
ECMAScript 2027 LanguageSpecification
# prod-PropertyDefinition

Compatibilidade com navegadores

Veja tambm


Web Proxy Viewer  |  New URL  |  Original Page