javascript中不能直接声明动态变量名,但可用方括号语法obj[propertyname]动态设置或读取对象属性;propertyname须为字符串、数字或symbol,支持表达式和变量,点号语法不适用;reflect.set/get提供更安全、语义明确的替代方案。

JavaScript 中不能直接用“动态变量名”声明变量,但可以用动态字符串作为属性名来添加或读取对象的属性——核心是使用方括号语法 [],而非点号语法 .。
用动态属性名添加属性
当属性名在运行时才确定(比如来自变量、函数返回值或用户输入),必须用方括号语法赋值:
-
语法:
obj[propertyName] = value; - propertyName 必须是字符串、数字或 Symbol;如果是变量,它应已持有合法的属性名字符串
- 例如:let key = "userName"; obj[key] = "Alice"; 等价于 obj.userName = "Alice"
- 支持表达式:obj["user_" + id] = data; 或 obj[`count-${index}`] = 10;
用动态属性名读取属性
读取方式与添加一致,同样依赖方括号语法:
-
语法:
const value = obj[propertyName]; - 如果属性不存在,结果为
undefined(不会报错) - 可配合可选链(
?.)避免访问深层动态属性时报错:obj?.[key]?.[subKey] - 注意:点号语法不接受变量,obj.key 永远读取字面量名为
"key"的属性,不是变量key的值
安全性和边界情况提醒
动态属性名灵活,但也需注意几个常见陷阱:
-
空值/非字符串类型:若
propertyName是null、undefined或对象,会被隐式转成字符串(如obj[null]→obj["null"]),容易引发意外 -
验证必要性:从用户输入或外部数据获取属性名时,建议先校验是否符合标识符规范(可用正则
/^[a-zA-Z_$][a-zA-Z0-9_$]*$/粗略判断),或白名单过滤 - for...in 与 Object.keys():动态添加的属性和普通属性一样可被遍历,无特殊限制
替代方案:Reflect.set() 和 Reflect.get()
ES6 提供了更显式的 API,语义清晰且支持代理(Proxy)场景:
- 设置:Reflect.set(obj, key, value) —— 返回布尔值表示是否成功(对不可写属性返回 false)
- 读取:Reflect.get(obj, key) —— 支持第三个参数
receiver,用于指定 this 上下文(常用于 Proxy 中) - 优势:比
[]更适合封装、拦截或需要失败反馈的逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











