我在编程和javascript方面相当新手,而且我正在通过一些示例问题来更好地完成CodeWars.com
我刚刚完成的问题询问如下:
编写一个名为calculate的函数,该函数取3个值。第一个和第三个值是数字。第二个值是一个字符。如果字符是“+”,“ - ”,“*”或“/”,则该函数将返回两个数字上相应数学函数的结果。如果字符串不是指定字符之一,则该函数应返回null。
它为您提供以下代码:
function calculate(num1, operation, num2) {
//TODO: make a basic calculator.
它根据以下测试用例检查您的代码:
Test.assertSimilar(calculate(3.2,"+", 8), 11.2, "3.2 + 8 = 11.2")
Test.assertSimilar(calculate(3.2,"-", 8), -4.8, "3.2 - 8 = -4.8")
Test.assertSimilar(calculate(3.2,"/", 8), 0.4, "3.2 / 8 = .4")
Test.assertSimilar(calculate(3.2,"*", 8), 25.6, "3.2 * 8 = 25.6")
Test.assertSimilar(calculate(-3,"+", 0), -3, "-3 + 0 = -3")
Test.assertSimilar(calculate(-3,"-", 0), -3, "-3 - 0 = -3")
Test.assertSimilar(calculate(-3,"/", 0), null, "-3 / 0 = null")
Test.assertSimilar(calculate(-3,"*", 0), 0, "-3 * 0 = 0")
Test.assertSimilar(calculate(-3,"w", 0), null, "-3 w 0 = null")
我通过运行一系列if和else if循环( JSFiddle )完成了所有测试用例:
function calculate(num1, operation, num2) {
//TODO: make a basic calculator.
if (operation === '+'){
console.log(num1 + num2);
}
else if (operation === '-'){
console.log(num1 - num2);
}
else if (operation === '/'){
console.log(num1 / num2);
}
else if (operation === '*'){
console.log(num1 * num2);
}
else{
return null;
}
}
calculate(3.2,"*", 8);
calculate(-3,"+", 0);
calculate(-3,"-", 0);
我知道这不是最优雅的解决方案,我很想找到改进和简化代码的方法。关于开始新事物的最困难的部分是能够提出正确的问题,所以如果我能得到关于如何更好地简化我的代码的一些意见,我会很高兴!
谢谢
答案 0 :(得分:1)
您可以使用switch
。
switch (operation) {
case '+':
console.log(num1 + num2);
break;
case '-':
console.log(num1 - num2);
break;
case '/':
console.log(num1 / num2);
break;
case '*':
console.log(num1 * num2);
break;
default:
return null;
}
有些人不喜欢开关,因为您必须记住明确包含break
语句(或return
或throw
),以避免代码落入下一个{{ 1}}并且可能会导致意想不到的后果(尽管如果你故意这样做,这种能力下降可能会很方便。)
除了避免重复变量名之外,case
的主要优点在于,对于那些熟悉变量名称的人来说,更容易一目了然地发现正在发生的事情,而不是必须检查每个switch
条件,以确切了解条件是什么,因为每个if
可能会检查不同的内容。 if
始终只检查一个表达式的结果。
(顺便说一下,抛出一个异常而不是返回switch
可能是一个更好的主意,因为它会停止执行而不是继续使用潜在的意外行为,以防你不小心让错误的操作符进入函数。)< / p>
如果仅仅是简化是你的目标(而不是安全性,因为基于使用null
的不可信输入,以下内容不安全),您可以执行以下操作:
eval