Hace un año me mudé de los lenguajes OO clásicos como Java a JavaScript. El siguiente código definitivamente no se recomienda (o incluso no es correcto) en Java:
if(dayNumber = getClickedDayNumber(dayInfo))
{
alert("day number found : " + dayNumber);
}
function getClickedDayNumber(dayInfo)
{
dayNumber = dayInfo.indexOf("fc-day");
if(dayNumber != -1) //substring found
{
//normally any calendar month consists of "40" days, so this will definitely pick up its day number.
return parseInt(dayInfo.substring(dayNumber+6, dayNumber+8));
}
else return false;
}
Básicamente, acabo de descubrir que puedo asignar una variable a un valor en una declaración de condición if e inmediatamente verificar el valor asignado como si fuera booleano.
Para una apuesta más segura, generalmente lo separo en dos líneas de código, primero lo asigno y luego verifico la variable, pero ahora que encontré esto, me pregunto si es una buena práctica o no a los ojos de los desarrolladores de JavaScript experimentados.
javascript
Michael Mao
fuente
fuente
"The following code is definitely not recommended (or event not correct) in Java..."
¿Es incluso correcto en JavaScript? Porque, por lo que puedo ver, devuelve un entero (return parseInt(...)
) sidayNumber != -1
es verdadero, pero un booleano si es falso.Respuestas:
Yo no lo recomendaría. El problema es que parece un error común en el que intenta comparar valores, pero usa un solo en
=
lugar de==
o===
. Por ejemplo, cuando ve esto:no sabes si eso es lo que querían hacer o si tenían la intención de escribir esto:
Si realmente desea hacer la tarea en su lugar, le recomendaría hacer una comparación explícita también:
fuente
if (resultArr = myNeedle.exec(myHaystack)) {...}
funciona,if ((resultArr = myNeedle.exec(myHaystack)) === true) {...}
no porque la asignación a resultArr es siempre verdadera incluso cuando la función result no lo es. Si alguien usa esta construcción .., recuerde declarar primero la variable de resultado; 'var' no es legal dentro de la declaración de condición if.if (!!(value = someFunction()))
, pero como dijiste, el problema es que no puedes usarvar
inside,if
por lo que terminas creando un global o no logras nada, ya quevalue
de todos modos tienes que declarar en una línea separada. Es una pena, me gustó mucho esta construcción en C ++.true
solo cuando la función regresatrue
, pero en todos los demás casos (incluso cuando se devuelve una matriz, cadena, número o nulo) se evalúafalse
.No veo ninguna prueba de que no sea una buena práctica. Sí, puede parecer un error, pero se remedia fácilmente con comentarios juiciosos. Tomemos, por ejemplo:
¿Por qué debería permitirse que esa función se ejecute por segunda vez con:
¿Porque la primera versión se ve mal? No puedo estar de acuerdo con esa lógica.
fuente
x = processorItensiveFunction(); if(x) { alert(x); }
if ( ! x = anyFunction() )
que no es legible? No necesita ningún comentario.if-else
situación. Considere:if (condition) {...} else if (x = processorIntensiveFunction()) {alert(x)}
su anteriorx = processorIntensiveFunction();
sería un esfuerzo en vano si la inicialcondition
fuera cierta.Lo hice muchas veces. Para omitir la advertencia de JavaScript, agrego dos parens:
Debes evitarlo, si realmente quieres usarlo, escribe un comentario encima diciendo lo que estás haciendo.
fuente
if ((a = [1, 2]).length > 0) { console.log(a); }
wherea
aún no se ha inicializado en ninguna parte y de hecho funcionó (¡bueno! Hace que usar expresiones regulares sea mucho más fácil). ¿Es correcto que no necesito nada devar|const|let
aquí? ¿Sabes dónde puedo leer más sobre este truco ?También puede hacer esto en Java. Y no, no es una buena práctica. :)
(Y use
===
en Javascript para la igualdad de tipos. Lea el libro The Good Parts de Crockford sobre JS).fuente
if (foo = getSomeBoolValue()) { }
Hay un caso en el que lo haces, con
while
-loops.Cuando lee archivos, normalmente lo hace así:
Mire el
while
-loop en la línea 9. Allí, se lee una nueva línea y se almacena en una variable, y luego se ejecuta el contenido del bucle. Sé que esto no es unaif
declaración-, pero supongo que también se puede incluir un ciclo while en su pregunta.La razón de esto es que cuando usa a
FileInputStream
, cada vez que llamaFileInputStream.readLine()
, lee la siguiente línea en el archivo, por lo que si lo hubiera llamado desde el bucle con solofileIn.readLine() != null
sin asignar la variable, en lugar de llamar(currentLine = fileIn.readLine()) != null
, y luego lo hubiera llamado desde dentro del bucle también, solo obtendría cada segunda línea.Espero que lo entiendas y ¡buena suerte!
fuente
También puede hacer asignaciones dentro de declaraciones if en Java. Un buen ejemplo sería leer algo y escribirlo:
http://www.exampledepot.com/egs/java.io/CopyFile.html?l=new
El código:
fuente
¡Si tuviera que consultar el libro de Martin Fowlers Refactorización mejorando el diseño del código existente ! Luego, hay varios casos en los que sería una buena práctica, por ejemplo. condicionales largos y complejos para usar una función o llamada a un método para afirmar su caso:
Y sí, su respuesta también es válida para implementaciones de Java. Aunque no asigna la función condicional a una variable en los ejemplos.
fuente
No es una buena práctica. Pronto te confundirás al respecto. Parece similar a un error común: mal uso de los operadores "=" y "==".
Debes dividirlo en 2 líneas de códigos. No solo ayuda a que el código sea más claro, sino que también es fácil de refactorizar en el futuro. ¿Imagina que cambia la condición IF? Puede eliminar accidentalmente la línea y su variable ya no obtendrá el valor asignado.
fuente
Consideraría esto más como un estilo C de la vieja escuela; no es una buena práctica en JavaScript, por lo que debe evitarlo.
fuente
podrías hacer algo como esto:
fuente
Vine aquí desde Golang, donde es común ver algo como
En el que
err
está limitado a eseif
bloque únicamente. Como tal, esto es lo que estoy haciendo en es6, que parece bastante feo, pero no hace que mis estrictas reglas de eslint se quejen, y logra lo mismo.¿Las llaves extra definen un nuevo, eh, "alcance léxico"? Lo que significa que puedo usar
const
yerr
no está disponible para el bloque externo.fuente