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) | ? | ? | ? |