科学计算器开发:如何用字符串匹配对象键调用对应计算函数?
解决科学计算器中通过对象映射执行计算函数的问题
问题根源
你当前的calcFunctions对象存在核心问题:所有属性值都是立即执行的表达式结果,而非可调用的函数。比如cos: Math.cos(expression)会在定义对象时就计算出当时expression的余弦值并存储,后续无法再用它处理新的输入值,这就是为什么你调用时会得到undefined或函数不存在的错误。
解决方案
1. 重构calcFunctions为函数映射
将每个属性值改为接收数值参数、返回处理结果的函数(或执行对应操作的函数),这样才能在需要时传入最新的expression进行计算:
const calcFunctions = { ce: () => { console.log("ce"); return ""; // 返回空字符串重置输入 }, "x^2": (num) => num ** 2, radic: (num) => Math.sqrt(num), log: (num) => Math.log(num), cos: (num) => Math.cos(num), sin: (num) => Math.sin(num), tan: (num) => Math.tan(num), exp: (num) => Math.exp(num), "=": (num) => { console.log("="); return num; // 等于号返回当前计算值,可按需调整 }, undefined: () => { console.log("undefined"); return ""; } };
2. 修改调用逻辑,执行函数并更新expression
当匹配到对应键时,调用映射的函数,传入转换为数字的expression,并更新结果:
// 注意:原代码中value !== undefined时重置的逻辑可能不符合需求,可根据实际场景调整 if (value === undefined) { expression = ""; ans.value = 0; } if (calcFunctions.hasOwnProperty(value)) { console.log(`${value} exists`); // 将输入的字符串转为数字,传入函数计算 const numValue = parseFloat(expression); // 执行函数并更新expression expression = calcFunctions[value](numValue); // 更新显示结果 ans.value = expression; }
关键注意事项
- 字符串转数字:输入框的
expression是字符串类型,必须先转为数字(parseFloat/Number)再传入数学函数,否则会导致计算错误。 - 操作类函数的返回值:像
ce这类重置操作,要返回合适的值来更新expression,确保计算器状态正确。
内容的提问来源于stack exchange,提问作者user21629409
相关产品推荐
相关产品推荐

