31

Evitar la modificación o pasando arguments en otras funciones - mata la optimización

Dentro de las funciones de JavaScript, el nombre de la variable arguments le permite acceder a todos los argumentos pasados a la función. arguments en un array-like object; arguments se puede acceder usando array notation, y tiene la propiedad longitud, pero no tiene muchos de los métodos incorporados en arrays que tienen como filter y map y forEach. Debido a esto, es una práctica bastante común para convertir arguments en una matriz utilizando el siguiente fragmento.

###Background

Dentro de las funciones de JavaScript, el nombre de la variable arguments le permite acceder a todos los argumentos pasados a la función. arguments es una array-like object; arguments se puede acceder usando la array notation, y tiene la propiedad longitud, pero no tiene por qué muchos de los métodos incorporados en los arrays que tienen comofilter y map y foreach. Debido a esto, es una práctica bastante común para convertir arguments en un array utilizando:

var args = Array.prototype.slice.call(arguments);

Este método slice del prototipo array, pasándole arguments; el método slice devuelve una copia superficial del arguments como un nuevo objeto de matriz. A la abreviatura común para esto es:

var args = [].slice.call(arguments);

En este caso, en lugar de llamar slice del prototipo Array, se trata simplemente de ser llamado desde un array vacío literal.

###Optimización

Desafortunadamente, pasando arguments en cualquier llamada de función hará que el motor V8 JavaScript utilizado en Chrome y NodeJS para omitir la optimización de la función que hace esto, lo que puede resultar en un rendimiento considerablemente más lento. Ver este artículo optimization killers. Pasando arguments a cualquier otra función que se conoce como leaking arguments.

En cambio, si quieres un array de los argumentos que le permite utilizar lo que necesita recurrir a este:

var args = new Array(arguments.length);
for(var i = 0; i < args.length; ++i) {
  args[i] = arguments[i];
}

Sí, es más prolija, pero en el código de producción, vale la pena para la optimización del rendimiento.