René Pacios

/* Overflow My Brain & More */

Uso de parámetros opcionales con JavaScript

Hoy os contaré un pequeño tip, ahora que estamos retomando el blog, lo haré poco a poco, así que prometo no extenderme mucho, o por lo menos, lo intentaré.

Muchos lenguajes de programación nos brindan la posibilidad de definir parámetros opcionales en sus métodos, de modo que podemos usarlo obviando alguno sin recibir ningún tipo de error. Cada lenguaje tiene sus propias restricciones/convenciones para este mecanismos. Algo que suelen tener en común es la definición de un valor por defecto al parámetro opcional, que será asumido por la variable en el momento que no lo incluyamos ningún valor en la llamada.

Sub Calcular(Optional ByVal IncluirIVA As Boolean = False)
    '..... cuerpo
End Sub
Calcular(True)
Calcular() 'llamada sin usando el valor por omisión

Con JavaScript no dispon��amos (veremos que este tema está cambiando), de una forma directa de indicar este valor por defecto de los parámetros de una función, pero podemos implementar cierto mecanismo para obtener un comportamiento similar. Para conseguirlo aprovechamos la gran flexibilidad que nos aportan los lenguajes débilmente tipados, como es el caso de JavaScript, en donde el tipo de dato que contendrá una variable es inferido en tiempo de ejecución, de modo que una misma función podría ser llamada de múltiples formas sin obtener ni un sólo problema de compilación o interpretación en este caso.

//en las funciones tampoco se tipan los parámetros
function foo(a1, b1) { }

foo(1, '3'); //llamada a la función pasando un numero y una cadena foo('cadena', null); //podemos enviar un nulo foo({mivar:'2'}); //pasando un sólo parámetro de tipo objeto foo(); //o incluso llamara a la función si pasar ningun parámetro

Esta flexibilidad del lenguaje implica, normalmente, que en el cuerpo de nuestra función utilicemos algún tipo de mecanismo que verifique/valide con que clase de parámetros es utilizada. Los parámetros omitidos podrán ser detectados de manera sencilla porque “contendrán” el valor undefined (en un principio reservado por el lenguaje). Como seguramente ya habréis deducido, el mecanismo para asignar valores por defecto a los parámetros “opcionales” pasa por preguntar por el valor del parámetro se corresponde con undefined pues asignarle un valor por defecto. Existe un patrón muy común que he visto asiduamente y es el siguiente:

function foo(a1, b1) {

    a1 = a1 || 'valor por defecto para a1';
    b1 = b1 || 'valor por defecto para b1'; 

    //....
    console.log(a1, b1);

}

Gracias a la evaluación en cortocircuito, la ausencia de valor para b1 (valor undefined) será evaluada a falso, con lo cual se asignará el valor del 2º termino de la condición, la sentencia equivalente sería b1=’valor por defecto para b1’. Tened cuidado si usáis este método y el objetivo es pasar un valor nulo, el valor null también se evalúa a falso, de modo que se le asignaría el valor por defecto y no podríamos forzar el valor null.

Sin embargo este mecanismo tan común, aunque funcione correctamente, presenta un pequeño problema de rendimiento, y es que siempre se está realizando la asignación de las variables. Por ejemplo, en el caso anterior, el parámetro a1 al que le estamos pasando un valor, está realizando una asignación de ese mismo valor sobre a1,equivalente a hacer a1=a1; Otra forma de conseguir el comportamiento de los valores por defecto en los parámetros y que soluciona este pequeño handicap de rendimiento, es la siguiente:

function foo(a1, b1) {

   a1 || (a1='valor por defecto para a1');
   b1 || (b1 = 'valor por defecto para b1');

    //....
    console.log(a1, b1);

}

La solución a esto es sencilla, aunque tal vez no resulte tan natural a vista por ese motivo he querido hacer una introducción con el fragmento anterior, y es aprovechando las propiedades del operador OR en cortocircuito como en caso anterior, evaluamos si es necesario realizar la asignación o no.

ECMAScript 6 al poder

Uno de las evoluciones que están haciendo en los lenguajes cliente basados en el estándar ECMAScript es precisamente la inclusión de los parámetros opcionales en los métodos al igual que ocurría en C# (4.0 +) o VB, De modo que vamos a poder hacer cosas como esta:

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

multiply(5); // 5

Como desarrollador .NET que utilizó durante muchos años Visual Basic, se trata de una característica que me resulta muy natural y que bien recibida sea. Lo malo, es que a día de hoy, solamente Firefox (Gecko) 15 lo soporta, e implementar un fallback para ello croe que sería una opción laboriosa y poco productiva, y dado lo que suelen tardar en adoptar estos cambios los distintos fabricantes en sus navegadores, pienso que nos va a tocar seguir utilizando métodos similares a los descritos al comienzo del post.

Nos leemos.

Referencias: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/default_parameters

Acerca de René

René Pacios es un apasionado de la tecnología, autodidacta, emprendedor, le encanta el desarrollo web, para moviles, aplicaciones, todo aquello que automatice tareas y haga que las máquinas trabajen para él. Es un gran fan de las tecnologías Microsoft, y le encanta estar a la última siempre que el tiempo se lo permite. Siempre quiso ser cantante, pero creo que en esta vida se va a quedar sólo en canta-mañanas

               

Agregar comentario

Loading