Estaba haciendo una calculadora simple con JavaScript y, después de terminarla, comencé a buscar algunas partes de mi código que podrían mejorarse. Había estado tratando de hacer que apareciera una alerta si se ingresaba el número 0 o vacío en el indicador y funcionaba, pero luego hice clic en el botón CANCELAR en el indicador y se produjo el mismo resultado. Mi pregunta es ¿cómo puedo cambiar el código a continuación para poder tener una salida para el valor 0 o vacío y otra para el botón CANCELAR?
const operacao = Number( prompt( `Qual a sua operação hoje? 1 - Soma (+) 2 - Subtração (-) 3 - Multiplicação (*) 4 - Divisão (/) 5 - Potenciação (^) 6 - Raiz (*/) 7 - Logaritmo natural (log) 8 - Divisão inteira (resto) `, ["Digite aqui!"] ) ); if (operacao == false) { if (confirm("Quer mesmo sair?") == true) { Window.close(); } else { calculadora(); } } else if (operacao < 1 || operacao > 8) { alert("Por favor, escolha um número que retorne uma operação!"); calculadora(); } else if (!operacao) { alert("Por Favor, digite um número válido!"); calculadora(); }Según los documentos de aviso , "si el usuario hace clic en el botón Cancelar, esta función devuelve nulo". Lo primero que debe hacer con el resultado de prompt es convertirlo en un Number . Number(null) === 0 , por lo que cuando el usuario presiona Cancelar, todas las condiciones se evalúan contra 0 .
Sin embargo, coaccionar inmediatamente a Number es algo incorrecto, porque está perdiendo información . Una vez que lo haya hecho, no hay forma de saber la diferencia entre Cancelar y escribir 0 . En su lugar, vamos a eliminar la coerción de la siguiente manera:
const promptResult = prompt( `Qual a sua operação hoje? 1 - Soma (+) 2 - Subtração (-) 3 - Multiplicação (*) 4 - Divisão (/) 5 - Potenciação (^) 6 - Raiz (*/) 7 - Logaritmo natural (log) 8 - Divisão inteira (resto) `, ["Digite aqui!"] );Luego, agregaremos una verificación externa a sus condicionales:
if (promptResult === null) { // do whatever should happen when the user presses cancel } else { const operacao = Number(promptResult); // the rest of your code goes here ... Además, tenga en cuenta según los documentos que Number("invalid number") === NaN , por lo que donde dice else if (!operacao) , es más claro (aunque no menos correcto) si marca explícitamente NaN , es decir, else if (operacao === NaN) .