Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript:将基本数学运算传递给函数_Javascript_Function_Math - Fatal编程技术网

javascript:将基本数学运算传递给函数

javascript:将基本数学运算传递给函数,javascript,function,math,Javascript,Function,Math,我正在编写一个计算器,它接受表示计算的字符串并输出结果(如eval函数)。 在我的代码中,我定义了不同操作的含义,如下所示: const _ops = [ [ ["^", (a, b) => (+a) ** +b], ], [ ["*", (a, b) => +a * +b], ["/", (a, b) => +a / +b], ["%", (a, b) => +a % +b],

我正在编写一个计算器,它接受表示计算的字符串并输出结果(如
eval
函数)。 在我的代码中,我定义了不同操作的含义,如下所示:

const _ops = [
    [
        ["^", (a, b) => (+a) ** +b],
    ],
    [
        ["*", (a, b) => +a * +b],
        ["/", (a, b) => +a / +b],
        ["%", (a, b) => +a % +b],
    ],
    [
        ["+", (a, b) => +a + +b],
        ["-", (a, b) => +a - +b],
    ],
];
正如您所见,每次只有一个字符更改时,我都会重复函数部分(第一次除外…)

你知道我如何做到这一点而不必每次都重复函数声明吗


PS:如果你能想出一个更好的标题,请随意更改。

使用
eval
会有点像这样


const dynamicCalculation = (a ,b, operator) => {
   if (operator === "^") operator = "**"

   return eval("${+a} ${operator} ${+b}")
}

用法:

dynamicCalculation(1,2,"+") // => 3
dynamicCalculation(1,2,"-") // => -1
dynamicCalculation(1,2,"*") // => 2
开关:

const dynamicCalculation = (a ,b, operator) => {
    let output;
    switch(operator){
       case "+":
           output = a + b;
           break;
       case "-":
           output = a - b;
           break;
       case "*":
           output = a * b;
           break;
       case "/":
           output = a / b;
           break;
       case "^":
           output = a ** b;
           break;
       case "%":
           output = a % b;
           break;
    }

    return output
}


使用
eval
看起来有点像这样


const dynamicCalculation = (a ,b, operator) => {
   if (operator === "^") operator = "**"

   return eval("${+a} ${operator} ${+b}")
}

用法:

dynamicCalculation(1,2,"+") // => 3
dynamicCalculation(1,2,"-") // => -1
dynamicCalculation(1,2,"*") // => 2
开关:

const dynamicCalculation = (a ,b, operator) => {
    let output;
    switch(operator){
       case "+":
           output = a + b;
           break;
       case "-":
           output = a - b;
           break;
       case "*":
           output = a * b;
           break;
       case "/":
           output = a / b;
           break;
       case "^":
           output = a ** b;
           break;
       case "%":
           output = a % b;
           break;
    }

    return output
}


不,如果没有
eval
,这在JavaScript中是不可能的。这是因为无法将运算符视为函数。但情况并非如此,例如在Haskell中,
(*)
表示乘法函数,您可以将其作为一个值携带,应用一个值来获得部分应用的运算符,然后应用另一个值来获得结果。

不,在JavaScript中,如果没有
eval
,这是不可能的。这是因为无法将运算符视为函数。但情况并非如此,例如在Haskell中,
(*)
表示乘法函数,您可以将其作为一个值携带,应用一个值来获得部分应用的运算符,然后应用另一个值来获得结果。

这可能是JavaScript中最好的方法。唯一的选择是使用
eval()
,这也有它自己的问题。我同意,没有
eval
,没有任何方法可以简化它。顺便说一句,我会使用对象而不是数组,例如
{“*”:(a,b)=>+a*+b,“/”:(a,b)=>+a/+b,…}
这可能是JavaScript中最好的方法。唯一的选择是使用
eval()
,这也有它自己的问题。我同意,没有
eval
,没有任何方法可以简化它。顺便说一句,我会使用对象而不是数组,例如
{“*”:(a,b)=>+a*+b,“/”:(a,b)=>+a/+b,…}
我编写计算器基本上是为了避免求值-我的问题是如何通过每次编写完整函数来避免重复我自己,另一种方法是使用switch语句,但它没有太大的好处switch语句如何避免重复?switch不会避免重复,但它可以避免求值。我基本上是这样写的计算器避免求值-我的问题是如何通过每次编写完整的函数来避免重复我自己。另一种方法是使用switch语句,但效果不太好switch语句如何避免重复?switch语句不会避免重复,但它可以避免求值