Parámetros por defecto

Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del inglés.

This is a new technology, part of the ECMAScript 2015 (ES6) standard.
This technology's specification has been finalized, but check the compatibility table for usage and implementation status in various browsers.

Los parámetros por defecto de una función permiten que los parámetros formales de la función sean inicializados con valores por defecto si no se pasan valores o los valores pasados son undefined.

Sintaxis

function [nombre]([param1[ = valorPorDefecto1 ][, ..., paramN[ = valorPorDefectoN ]]]) {
   declaraciones
}

Descripción

En JavaScript, los parámetros de funciones son por defecto undefined. De todos modos, en algunas situaciones puede ser útil colocar un valor por defecto diferente. Aquí es donde los parámetros por defecto pueden ayudar.

En el pasado, la estrategia general para colocar valores por defecto era probar los valores de los parámetros en el cuerpo de la función y asignarles un valor si eran undefined. Si en el siguiente ejemplo no se proveyera un valor para b en la llamada, su valor sería undefined cuando se evalúe a*b y la llamada a multiplicar hubiera retornado NaN. De todos modos, esto es capturado en la segunda línea de este ejemplo:

function multiplicar(a, b) {
  b = typeof b !== 'undefined' ?  b : 1;

  return a*b;
}

multiplicar(5); // 5

Con parámetros por defecto, la verificación en el cuerpo de la función ya no es necesaria. Ahora, puedes colocar simplemente 1 como el valor por defecto de b en la cabecera de la función:

function multiplicar(a, b = 1) {
  return a*b;
}

multiplicar(5); // 5

Ejemplos

Pasando undefined

En la segunda llamada aquí, aunque el segundo argumento sea explícitamente declarado como undefined cuando se haga la llamada, el valor del argumento color será el que se tiene por defecto.

function setBackgroundColor(elemento, color = 'rosybrown') {
  elemento.style.backgroundColor = color;
}

setBackgroundColor(algunDiv);            // color configurado a 'rosybrown'
setBackgroundColor(algunDiv, undefined); // color configurado a 'rosybrown' también
setBackgroundColor(algunDiv, 'blue');    // color configurado a 'blue' 

Evaluado al momento de la llamada

El argumento por defecto se evalúa en la llamada, a diferencia de p.ej. Python, un nuevo objeto es creado cada vez que la función es llamada.

function agregar(valor, arreglo = []) {
  arreglo.push(valor);
  return arreglo;
}

agregar(1); //[1]
agregar(2); //[2], not [1, 2]

Esto también se aplica a funciones y variables:

function llamarAlgo(cosa = algo()) { return cosa; }

function algo(){
  return "esto";
}

llamarAlgo();  //esto

Los parámetros por defecto están disponibles para posteriores parámetros por defecto

Loa parámetros ya encontrados están disponibles para los parámetros siguientes:

function singularAutoPlural(singular, plural = singular+"s", 
                            gritoDeGuerra = plural + " ¡¡¡ATAQUEN!!!") {
  return [singular, plural, gritoDeGuerra ]; 
}

//["Gecko","Geckos", "Geckos ¡¡¡ATAQUEN!!!"]
singularAutoPlural("Gecko");

//["Aprendiz","Aprendices", "Aprendices ¡¡¡ATAQUEN!!!"]
singularAutoPlural("Aprendiz","Aprendices");

//["Ciervo", "Ciervo", "Ciervo ... positivo."]
singularAutoPlural("Ciervo", "Ciervo", "Ciervo hace una petición pacífica y respetuosa
   al gobierno para un cambio positivo.")

Esta funcionalidad es aproximada de una forma directa y demuestra cuantos casos límite son manejados.

function ir() {
  return ":P"
}

function conPorDefecto(a, b = 5, c = b, d = ir(), e = this, 
                      f = arguments, g = this.value) {
  return [a,b,c,d,e,f,g];
}
function sinPorDefecto(a, b, c, d, e, f, g){
  switch(arguments.length){
    case 0:
      a
    case 1:
      b = 5
    case 2:
      c = b
    case 3:
      d = ir();
    case 4:
      e = this
    case 5:
      f = arguments
    case 6:
      g = this.value;
    default:
  }
  return [a,b,c,d,e,f,g];
}

conPorDefecto.call({value:"=^_^="});
// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]


sinPorDefecto.call({value:"=^_^="});
// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]

Funciones definidas dentro del cuerpo de una función

Se introdujo en Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). Las funciones decladaras en el cuerpo de la función no pueden ser referidas dentro de los parámetros por defecto y arroja un ReferenceError (actualmente un TypeError en SpiderMonkey, ver bug 1022967). Los parámetros por defecto son siempre ejecutados primero, las declaraciones de funciones dentro del cuerpo de la función son evaluadas después.

// ¡No funciona! Arroja ReferenceError.
function f(a = ir()) {
  function ir(){return ":P"}
}

Parámetros no por defecto luego de parámetros por defecto

Antes de Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2), el siguiente código resultaba en un SyntaxError. Esto ha sido arreglado en bug 777060 y funciona como se espera en versiones posteriores:

function f(x=1, y) { 
  return [x, y]; 
}

f(); // [1, undefined]

Parámetro destructurado con asignación de valor por defecto

Puedes usar asignación de valor por defecto con la notación de asignación por destructuración:

function f([x, y] = [1, 2], {z: z} = {z: 3}) { 
  return x + y + z; 
}

f(); // 6

Especificaciones

Especificación Estado Comentario
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Function Definitions' in that specification.
Standard Definición inicial.

Compatibilidad con navegadores

Característica Chrome Firefox (Gecko) Internet Explorer Opera Safari
Soporte básico Not supported 15.0 (15.0) Not supported Not supported Not supported
Parámetros no por defecto después de parámetros por defecto Not supported 26.0 (26.0) ? ? ?
Parámetro destructurado con asignación de valor por defecto Not supported 41.0 (41.0) ? ? ?
Característica Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Soporte básico (Yes) (Yes) 15.0 (15.0) Not supported Not supported Not supported
Parámetros no por defecto después de parámetros por defecto ? ? 26.0 (26.0) ? ? ?
Parámetro destructurado con asignación de valor por defecto ? ? 41.0 (41.0) ? ? ?

Vea también

Etiquetas y colaboradores del documento

 Colaboradores en esta página: pancheps
 Última actualización por: pancheps,