Parece haber una gran aversión a crear una función en JS. Esta aversión hace que las personas traten de ser inteligentes y usen trucos ridículos solo para mantener las cosas en una línea como lo hubiera sido una llamada de función. Por supuesto, el nombre de la función en una llamada también actúa como documentación adicional. No podemos adjuntar un comentario a una expresión engañosa porque entonces sería contraproducente hacerlo, así que simplemente lo llamamos "js idiom" y de repente es comprensible.
Javascript es extremadamente accesible, la mayoría de las personas no comen especificaciones para el desayuno como nosotros. Por lo tanto, nunca entenderán cuáles son las suposiciones ocultas y los casos extremos de un idioma.
x = x || 'default_value';
El Joe promedio no entenderá esto o ha memorizado que es el idioma para el valor predeterminado. Ambos son dañinos, de hecho, el último es aún más dañino. Él no entenderá los supuestos y los casos extremos aquí. No le importará leer la especificación y comprenderla nunca.
Cuando miro a ese código que ver "si es null
o undefined
, luego otra vez en este valor por defecto. A pesar de que también tratará de manera implícita +0
, -0
, NaN
, false
, y ""
los valores no adecuados. Voy a tener que recordar que 3 meses a partir de ahora cuando que las necesidades cambiar. Probablemente lo olvidaré ".
La suposición implícita es extremadamente probable que cause un error en el futuro y cuando su base de código está llena de trucos como este, entonces no hay posibilidad de que los tenga en su cabeza cada vez que piense en lo que afectará una modificación. Y esto es para el "JS pro", el Joe promedio habría escrito el error, incluso si los requisitos fueran aceptar un valor falso para empezar.
Su nuevo fragmento tiene una sintaxis más familiar pero aún tiene el problema anterior.
Puedes ir con:
function f(x) {
x = valueOrDefault(x, "default_value");
}
Ahora puede tener una lógica muy compleja para manejar los casos extremos y el código del cliente todavía se ve hermoso y legible.
Ahora, ¿cómo se diferencia entre la función de lenguaje avanzado como pasar una función como argumento o un truco inteligente como || "default"
?
Los trucos inteligentes siempre funcionan bajo algunos supuestos ocultos que podrían ignorarse cuando se creó el código inicialmente. Nunca tendré que modificar un IIFE a otra cosa porque un requisito cambió, siempre estará allí. Tal vez en 2020 cuando pueda usar módulos reales, pero sí.
| 0
o la versión de culto de carga ~~num
utilizada para pisos asume límites enteros positivos y con signo de 32 bits.
|| "default"
asume que todos los valores falsos son iguales a no pasar un argumento en absoluto.
Y así.