表达式计算器用Map存储变量名与数值的映射,支持动态增删、特殊字符键名及大小写敏感;通过set/get操作管理变量,需校验值类型并封装查找逻辑以保障安全性和作用域控制。

在表达式计算器中,用 Map 存储变量名与数值的动态映射,核心是把变量名(字符串)作为键,把计算出的数值作为值,支持后续表达式中直接引用该变量。它比普通对象更安全、更灵活,尤其适合频繁增删变量或变量名含特殊字符(如数字开头、符号)的场景。
用 Map 存储和读取变量
初始化一个空 Map 作为变量环境,每次赋值(如 a = 5)就调用 set(key, value);解析表达式遇到变量名时,用 get(key) 获取值。如果变量未定义,可返回 undefined 或抛错提示。
-
示例:
const env = new Map(); env.set('x', 10); env.set('y', 2.5); console.log(env.get('x') + env.get('y')); // 12.5 - 变量名区分大小写,
'X'和'x'是不同键,天然支持 - 支持任意字符串作键,比如
env.set('2a', 7)或env.set('user-name', 42),而普通对象属性名会自动转为字符串且不推荐数字开头
在表达式解析中集成变量查找
当词法分析器识别出标识符(如 pi、total),不要立即报错“未定义”,而是查 env.get(token)。若返回 undefined,再按规则处理(如当作函数名、或抛 ReferenceError)。
- 建议封装一个
resolveVariable(name)函数,统一处理缺失逻辑(例如:返回NaN、抛错、或 fallback 到全局常量如Math.PI) - 避免直接暴露
env给解析器外部,防止误删或覆盖,可用闭包或类封装环境
支持变量作用域(可选进阶)
简单计算器可用单层 Map;若需局部作用域(如函数内定义变量不影响外层),可维护一个 Map 栈:当前作用域 Map 在栈顶,查找变量时从顶向下遍历,set 默认写入栈顶。
立即学习“Java免费学习笔记(深入)”;
- 进入新作用域 →
envStack.push(new Map()) - 退出作用域 →
envStack.pop() - 查找变量 →
[...envStack].reverse().find(map => map.has(name))?.get(name)
注意类型与安全性
Map 本身不限制值类型,但表达式计算器通常只接受数字(number)、null 或 undefined。建议在 set 前校验:
- 拒绝
NaN、Infinity(除非明确支持) - 自动转换字符串数字(如
'3.14'→3.14),但警惕'1e2'等科学计数法是否允许 - 禁止存函数、对象等非标量值,避免后续运算出错


















