javascript不支持$$var式动态变量名,推荐用对象属性模拟:const vars = {}; vars[key] = value; 其次可选window/global(仅限特定场景),禁用eval/with。

JavaScript 本身不支持像 PHP 那样的 $$var 式原生动态变量名,但可以通过几种安全、可控的方式模拟“用字符串当变量名”的行为。核心思路不是真去创建语法级变量,而是把动态名称映射到可管理的数据结构中——最常用、最推荐的是对象属性访问。
用对象属性模拟动态变量名
这是最清晰、最安全、最符合现代 JS 实践的方式。把所有“动态变量”统一存进一个普通对象,用方括号语法读写:
- 定义:
const vars = {}; - 赋值:
const key = 'userCount'; vars[key] = 42; - 取值:
console.log(vars[key]); // 42 - 批量操作也很自然:
['name', 'age', 'city'].forEach(k => vars[k] = getData(k));
它天然支持局部作用域、避免污染全局、类型友好,且能被 TypeScript 或 ESLint 正确识别。
通过 window 或 global 访问全局动态名(仅限特定环境)
在浏览器中,全局变量自动成为 window 对象的属性;Node.js 中对应 global。因此可以:
window['config_' + env] = { timeout: 5000 };console.log(window['config_prod'].timeout);
⚠️ 注意:仅适用于明确需要挂载为全局的场景(如插件扩展、配置注入),不推荐用于普通业务逻辑——容易引发命名冲突、内存泄漏,且无法在模块作用域或严格模式下可靠使用。
模板字符串插值与动态字段解析
常见于表单处理、API 响应映射、UI 绑定等场景。例如后端返回字段名是字符串,前端需按名取值:
- 响应数据:
{ "user_name": "张三", "user_email": "zhang@example.com" } - 动态提取:
const field = 'name'; const value = data['user_' + field]; - 结合解构更灵活:
const { [prefix + 'Name']: name } = data;
这类需求本质是“动态键访问”,对象属性方式完全胜任,无需引入 eval 或全局污染。
不推荐的方式:eval 和 with
eval('let ' + key + ' = ' + value) 或 with(obj) { /* 使用 key 当变量名 */ } 理论上可行,但存在严重问题:
- eval 执行任意代码,极易引发 XSS 和执行风险
- 静态分析工具无法检查,调试困难,性能差
- with 已被严格模式禁用,语义模糊,作用域混乱
除非极特殊遗留系统维护,否则应主动规避。
本质上,“动态变量名”真正需要的往往不是语法糖,而是运行时根据字符串决定数据路径的能力。用对象做中间层,既简洁又健壮,覆盖了配置管理、表单联动、多语言字段映射、状态缓存等绝大多数实际场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











