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语句不会避免重复,但它可以避免求值