3 formas de comparar y asignar en Javascript
A todos nos gusta escribir código que se vea elegante y sobre todo límpio, siempre estamos buscando nuevas formas de hacer la misma operación para añadir mejoras de rendimiento, legibilidad, disminuir la cantidad de líneas de código, etc. Miremos 3 formas de evaluar una condición y asignar un valor dependiendo de dicha respuesta.
Dado los siguientes roles:
- Administrador
- Usuario mortal
Vamos a evaluar el tipo de perfil del siguiente objeto:
var user = {
displayName: 'Pedro Baltodano',
roleId: 1
}
Decidiremos si mostramos el menú del administrador dependiendo del tipo de perfil del usuario.
// Declaramos e inicializamos la variable showMenu,
// con la que determinaremos si mostramos el menú.
var showMenu = false
- Comparar y asignar un valor a showMenu
showMenu = user.roleId == 1
Preguntamos si el rol del usuario es igual a 1 (user.roleId == 1), la respuesta de esa comparación se la asignamos a la variable showMenu, en este caso es true.
2. Usando operador ternario
showMenu = user.roleId == 1 ? true : false
Esta expresión se divide en 3 secciones, la primera es la comparación (user.roleId == 1), la segunda es donde definimos lo que sucederá en caso de que la comparación de verdadero (? true), en caso contrario ( : false), y finalmente ese resultado ya sea true o false se lo asignamos a la variable showMenu, siendo el resultado true .
3. La tercer forma y para algunos desconocida, es usando el operador NOT NOT (doble negación)
Con el simple NOT (!) negamos una expresión, por ejemplo:
!true =>> false
!false =>> true
Pero usando ese operador 2 veces hacemos una doble negación:
!!true =>> true
!!false =>> false
Aplicándolo a nuestro ejemplo:
showMenu = !!user.roleId
El resultado es el mismo que en las 2 primeras formas, lo que está haciendo es que con el primer NOT niega el valor de user.roleId y el resultado es false, luego vuelve a negarlo y resulta true.
Obviamente no podemos hacer esto: showMenu = user.roleId, porque asignaría el valor de user.roleId a showMenu, y si sólo dejamos un operador NOT, siempre dará la respuesta contraria al valor real de la variable, tenemos que poner 2 operadores NOT, para que valide el valor real de la variable a la segunda negación.
Tal vez te preguntarás:
¿Cuál uso?
Es notorio que nos ahorramos trabajo con la tercer forma, pero el problema es leerlo y entenderlo, de seguro si otro programador trata de entender tú código se detendrá unos cuantos minutos ahí, a menos que todo el equipo se ponga de acuerdo sobre el estándar para codear (que así debería de ser), en caso que sólo tú lo sepas, puedes hacer 2 cosas, usar el que todos conozcan o compartirles este post (que también así debería de ser).
¿Cuál es mejor?
Vamos a hacer una simple comparación del rendimiento:
Según el test anterior, refleja que es óptima la primer forma (==), ya que puede realizar más operaciones en menor tiempo, así el operador NOT NOT queda descartado.
Este segundo test nos lanza un array con 3 objetos que corresponden a las 3 formas antes mencionadas de realizar comparaciones y asignaciones, aquí notamos que el primer lugar se lo lleva el operador ternario y una vez más el operador de doble negación lleva las de perder.
Conclusión
El uso del operador de doble negación es opcional de cada desarrollador y del equipo en el que está trabajando, si nos dejamos llevar por las pruebas anteriores la mejor opción a usar es el operador ternario, aunque en los propios módulos de NodeJs usan doble negación.
También podemos usarlo, siempre y cuando se evalúen los escenarios.