Quiero hacer una tarea matemática aleatoria con un signo de operación matemática aleatoria en el medio.
Los números aleatorios están bien. lo hago con:
function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min)) + min; }y guarde este retorno en var number1 y number2
Ahora el problema.
const mathOperationList = ['+', '-', '*', '/']; function getRandomOperation() { var randomMathOperation = mathOperationList[Math.floor(Math.random() * mathOperationList.length)]; return randomMathOperation; } var mathOperation = getRandomOperation(); console.log("What is "+number1 + " "+mathOperation+" "+number2 +"?"); mathResult = number1 +mathOperation+ number2; console.log(mathResult)La salida es: "1+1" (no 2)
La salida es una cadena y no un ResultInt. Sé que number1+mathOperation+number2 lo hacen, pero quiero un resultado matemático y no una cadena juntos.
¿Cómo puedo arreglarlo?
Puede usar la función eval que evalúa el código JavaScript arbitrario como una cadena.
Advertencia : eval es MUY peligroso debido a las vulnerabilidades XSS y nunca debe usarse para ejecutar entradas de usuario no serializadas.
const number1 = 3, number2 = 4; const mathOperationList = ['+', '-', '*', '/']; function getRandomOperation() { var randomMathOperation = mathOperationList[Math.floor(Math.random() * mathOperationList.length)]; return randomMathOperation; } const mathOperation = getRandomOperation(); console.log("What is "+number1 + " "+mathOperation+" "+number2 +"?"); const mathResult = eval(`${number1}${mathOperation}${number2}`); console.log(mathResult);Usando switch-case (más seguro)
const number1 = 3, number2 = 4; const mathOperationList = ['+', '-', '*', '/']; function getRandomOperation() { var randomMathOperation = mathOperationList[Math.floor(Math.random() * mathOperationList.length)]; return randomMathOperation; } function performOperation(left, right, operator) { switch (operator) { case "+": return left + right; case "-": return left - right; case "*": return left * right; case "/": return left / right; } } const mathOperation = getRandomOperation(); console.log("What is "+number1 + " "+mathOperation+" "+number2 +"?"); const mathResult = performOperation(number1, number2, mathOperation); console.log(mathResult); No debe usar eval() ya que puede presentar serios problemas de seguridad y es simplemente una mala práctica. En tu caso no hay mucho riesgo ya que los valores de momento no los proporciona un usuario, pero una vez que lo están te puedes meter en serios problemas.
Supongamos que permite que los usuarios proporcionen valores para el número y no los verifica adecuadamente, lo siguiente constituiría un ataque de denegación de servicio (DoS) exitoso en su programa porque esto causará un bucle infinito.
const number1 = "for(;;);"; const mathOperation = "+"; const number2 = 2; eval(number1 + mathOperation + number2); También abre otros vectores de ataque, así que simplemente no uses eval() .
En su lugar, declare una matriz de funciones, una función para cada operación y elija aleatoriamente una función.
function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min)) + min; } const mathOperationList = [ { func: (a, b) => a + b, symbol: "+" }, { func: (a, b) => a - b, symbol: "-" }, { func: (a, b) => a * b, symbol: "*" }, { func: (a, b) => a / b, symbol: "/" }, ]; function getRandomOperation() { const randomMathOperation = mathOperationList[Math.floor(Math.random() * mathOperationList.length)]; return randomMathOperation; } const { func: mathOperation, symbol } = getRandomOperation(); const number1 = getRandomInt(1, 10); const number2 = getRandomInt(1, 10); console.log("What is " + number1 + " " + symbol + " " + number2 + "?"); const mathResult = mathOperation(number1, number2); console.log(mathResult);Podría tomar un objeto con todas las funciones y obtener primero el operador.
const getRandomOperator = () => operators[Math.floor(Math.random() * operators.length)], operators = ['+', '-', '*', '/'], functions = { '+': (a, b) => a + b, '-': (a, b) => a - b, '*': (a, b) => a * b, '/': (a, b) => a / b }, operator = getRandomOperator(), number1 = 10, number2 = 5, result = functions[operator](number1, number2); console.log(`What is ${number1} ${operator} ${number2}?`); console.log(result);