在Javascript中,简单的计算器,不起作用

在Javascript中,简单的计算器,不起作用,javascript,function,prompt,Javascript,Function,Prompt,我试图通过prompt()获取数字,并获取操作名称。但结果并不像预期的那样 我是编程新手。。 代码: 函数add(n1,n2){返回n1+n2;} 函数sub(n1,n2){返回n1-n2;} 函数mult(n1,n2){返回n1*n2;} 函数div(n1,n2){返回n1/n2;} 函数计算器(n1、n2、动作){ 警报(行动(n1、n2)); } 计算器(提示(“第一个编号”)、提示(“第二个编号”)、提示(“计算”); 您需要做两件事: 将输入解析为float 映射用户给定的函数名 函

我试图通过prompt()获取数字,并获取操作名称。但结果并不像预期的那样

我是编程新手。。 代码:

函数add(n1,n2){返回n1+n2;}
函数sub(n1,n2){返回n1-n2;}
函数mult(n1,n2){返回n1*n2;}
函数div(n1,n2){返回n1/n2;}
函数计算器(n1、n2、动作){
警报(行动(n1、n2));
}
计算器(提示(“第一个编号”)、提示(“第二个编号”)、提示(“计算”);

您需要做两件事:

  • 将输入解析为float
  • 映射用户给定的函数名
  • 函数add(n1,n2){返回n1+n2;}
    函数sub(n1,n2){返回n1-n2;}
    函数mult(n1,n2){返回n1*n2;}
    函数div(n1,n2){返回n1/n2;}
    函数计算器(n1、n2、动作){
    警报(行动(n1、n2));
    }
    函数findOperation(名称){
    交换机(名称){
    案例“sub”:
    返回子节点;
    “mult”案:
    返回mult;
    案件“div”:
    返回div;
    案例“添加”:
    违约:
    返回添加;
    }
    }
    计算器(
    parseFloat(提示(“第一个编号”),
    parseFloat(提示(“第二个否”),
    findOperation(提示(“操作名称?”))
    
    );您需要做两件事:

  • 将输入解析为float
  • 映射用户给定的函数名
  • 函数add(n1,n2){返回n1+n2;}
    函数sub(n1,n2){返回n1-n2;}
    函数mult(n1,n2){返回n1*n2;}
    函数div(n1,n2){返回n1/n2;}
    函数计算器(n1、n2、动作){
    警报(行动(n1、n2));
    }
    函数findOperation(名称){
    交换机(名称){
    案例“sub”:
    返回子节点;
    “mult”案:
    返回mult;
    案件“div”:
    返回div;
    案例“添加”:
    违约:
    返回添加;
    }
    }
    计算器(
    parseFloat(提示(“第一个编号”),
    parseFloat(提示(“第二个否”),
    findOperation(提示(“操作名称?”))
    
    );计算器功能应为:

    function calculator(n1, n2, action){
    
        alert(eval(action+'('+n1+', '+n2+')'));
    }
    

    计算器功能应为:

    function calculator(n1, n2, action){
    
        alert(eval(action+'('+n1+', '+n2+')'));
    }
    

    我建议您花点时间学习一些基础知识,除非您像这样使用eval(),否则无法将字符串转换为函数调用:

    function add(n1, n2){ return n1 + n2;}
    function sub(n1, n2){ return n1 - n2;}
    function mult(n1, n2){ return n1 * n2;}
    function div(n1, n2){ return n1/n2;}
    
    function calculator(n1, n2, action){
    alert(eval(`${action}(${n1}, ${n2})`));
    }
    
    calculator(prompt("first no,"), prompt("second No"), prompt("calc"));
    
    但这是真正的黑客和不安全的代码,更好的方法是:

    const ops = {
    "add": (n1, n2) => n1 + n2,
    "sub": (n1, n2) => n1 - n2,
    "mult": (n1, n2) => n1 * n2,
    "div": (n1, n2) => n1/n2
    }
    
    function calculator(n1, n2, action){
    alert(ops[action](parseFloat(n1), parseFloat(n2)));
    }
    
    calculator(prompt("first no,"), prompt("second No"), prompt("calc"));
    
    还要注意parseFloat(),如果将参数保留为字符串,则将获得:


    输入:“1”、“2”、“添加”
    输出:“12”

    我建议您花点时间学习一些基础知识,除非您像这样使用eval(),否则无法将字符串转换为函数调用:

    function add(n1, n2){ return n1 + n2;}
    function sub(n1, n2){ return n1 - n2;}
    function mult(n1, n2){ return n1 * n2;}
    function div(n1, n2){ return n1/n2;}
    
    function calculator(n1, n2, action){
    alert(eval(`${action}(${n1}, ${n2})`));
    }
    
    calculator(prompt("first no,"), prompt("second No"), prompt("calc"));
    
    但这是真正的黑客和不安全的代码,更好的方法是:

    const ops = {
    "add": (n1, n2) => n1 + n2,
    "sub": (n1, n2) => n1 - n2,
    "mult": (n1, n2) => n1 * n2,
    "div": (n1, n2) => n1/n2
    }
    
    function calculator(n1, n2, action){
    alert(ops[action](parseFloat(n1), parseFloat(n2)));
    }
    
    calculator(prompt("first no,"), prompt("second No"), prompt("calc"));
    
    还要注意parseFloat(),如果将参数保留为字符串,则将获得:


    输入:“1”、“2”、“添加”
    输出:“12”

    操作必须是一个函数,但您可以向其传递一个字符串(浏览器会在控制台中告诉您:
    类型错误:操作不是函数
    ),而不是执行此操作,您可以创建具有这些方法的对象并调用这些方法。我应该在代码中的何处更改以按预期工作?,
    action
    必须是一个函数,但您可以向它传递一个字符串(浏览器将在控制台中告诉您:
    TypeError:action不是函数
    ),而不是执行此操作,您可以创建一个具有这些方法的对象并调用这些方法。我应该在代码中的什么地方进行更改才能按预期工作?