|
| 1 | +--- |
| 2 | +date: '2011-08-26T10:08:50.000Z' |
| 3 | +tags: |
| 4 | + - truthy |
| 5 | + - falsy |
| 6 | + - types |
| 7 | + - coercion |
| 8 | +title: What is the arguments object? |
| 9 | +difficulty: 4 |
| 10 | +layout: knowledge-post.hbs |
| 11 | +--- |
| 12 | + |
| 13 | +O objeto `arguments` é uma estrutura especial disponível dentro de todas as chamadas de função. É representada como uma lista de argumentos que são passados quando a função é chamada. Uma vez que o JavaScript permite chamar funções com indeterminado número indeterminado de argumentos, nós precisamos de um método para descobrir e acessar esses argumentos. |
| 14 | + |
| 15 | +O objeto `arguments` é um array-like, seu tamanho corresponde a quantidade de argumentos passados para a função. É possível acessar estes valores através da indexação do Array. Exemplo: `arguments[0]` captura o primeiro argumento. A única outra propriedade de `arguments` é chamada `callee`, a qual o ES5 impede o uso no `strict mode`, mais informações podem ser encontradas [aqui](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/callee). |
| 16 | +Veja mais exemplos sobre as propriedades de `arguments`. |
| 17 | + |
| 18 | +```js |
| 19 | +const myfunc = function(one) { |
| 20 | + arguments[0] === one; |
| 21 | + arguments[1] === 2; |
| 22 | + arguments.length === 3; |
| 23 | +} |
| 24 | + |
| 25 | +myfunc(1, 2, 3); |
| 26 | +``` |
| 27 | + |
| 28 | +Essa construção é muito útil e fornece muitas funções ao JavaScript. Mas há uma pegadinha. O objeto `arguments` se comporta como um tipo array, porém ele não é realmente um array. Ele não têm as funcionalidades que o Array herda de Array.prototype e não responde a nenhum método de array, exemplo. `arguments.sort()` gera um TypeError. Em vez disso, você precisa copiar os valores para um array verdadeiro. |
| 29 | +Com o advento do ES6 o método `Array.from()` torna isso bastante simples. |
| 30 | + |
| 31 | +```js |
| 32 | +const myfunc = function(a, b, c) { |
| 33 | + const args = Array.from(arguments); |
| 34 | + console.log(args) // [1, 2, 3] |
| 35 | +} |
| 36 | + |
| 37 | +myfunc(1, 2, 3); |
| 38 | +``` |
| 39 | +NOTA: Para ES5 e anteriores, um loop `for` normal pode fazer o truque |
| 40 | + |
| 41 | +Em alguns casos você ainda pode tratar o `arguments` como um Array, você pode usar o `arguments` através de invocações de funções dinâmicas. E a maioria dos métodos nativos Array (Ex. Array.prototype.concat) aceitarão `arguments` quando invocados dinamicamente utilizando `call` ou `apply`. Essa técnica também oferece outros modos de conversão dos `arguments` para um tipo Array utilizando método `Array.slice`. |
| 42 | + |
| 43 | +```js |
| 44 | +myfunc.apply(obj, arguments). |
| 45 | + |
| 46 | +// concat arguments onto the |
| 47 | +Array.prototype.concat.apply([1,2,3], arguments); |
| 48 | + |
| 49 | +// turn arguments into a true array |
| 50 | +const args = Array.prototype.slice.call(arguments); |
| 51 | + |
| 52 | +// cut out first argument |
| 53 | +args = Array.prototype.slice.call(arguments, 1); |
| 54 | +``` |
| 55 | + |
| 56 | +### Objeto Argments em arrow function |
| 57 | + |
| 58 | +As `arrow functions` foram adicionadas na especificação do ECMAScript 2015 (ES6), propondo uma alternativa mais compacta do que a declaração de uma função comum. A desvantagem dessa alternativa é que não existe mais o objecto `arguments` (e também as keywords `this`, `super` ou `new.target`). A solução para esses casos é o uso dos parâmetros `rest`. Os parâmetros `rest` permitem representar um número indeterminado de argumentos como um Array. Leia mais detalhes [aqui](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters). |
| 59 | + |
| 60 | +```js |
| 61 | +const myfunc = (...args) => { |
| 62 | + console.log('first parameter is ', args[0]); |
| 63 | +} |
| 64 | + |
| 65 | +myfunc(1, 2, 3); |
| 66 | +``` |
0 commit comments