
本文介绍如何在 JavaScript 中通过动态变量名访问嵌套对象属性,重点讲解使用方括号语法结合字符串拼接(concat、+、模板字面量)实现 ve1、ve2…ve20 等命名属性的循环访问,并推荐最佳实践。
本文介绍如何在 javascript 中通过动态变量名访问嵌套对象属性,重点讲解使用方括号语法结合字符串拼接(concat、+、模板字面量)实现 `ve1`、`ve2`…`ve20` 等命名属性的循环访问,并推荐最佳实践。
在实际开发中,我们常遇到对象属性名遵循固定模式(如 ve1、ve2、ve3…)但数量不固定的情况。此时无法使用点号(.)语法直接访问,因为 obj.ve[i] 会被解析为 obj.ve 数组的第 i 项,而非属性名为 "ve" + i 的键。正确做法是采用方括号属性访问语法(Bracket Notation),配合动态生成的字符串键名。
以下是三种安全、兼容性良好的实现方式:
✅ 方法一:模板字面量(推荐)
function testingLyrics() {
const musicItem = allMusic[indexNumb - 1];
const lyrics = musicItem?.lyrics;
if (!lyrics) return;
for (let i = 1; i <= Object.keys(lyrics).length; i++) {
const key = `ve${i}`;
if (lyrics[key]?.stamp) {
console.log('Verse found:', lyrics[key].ls);
// ✅ 执行你的业务逻辑,例如渲染歌词、触发动画等
}
}
}✨ 优势:语法简洁、可读性强、支持表达式插值;ES6+ 环境广泛支持;避免类型隐式转换风险。
✅ 方法二:字符串拼接(+ 运算符)
if (allMusic[indexNumb - 1].lyrics['ve' + i].stamp) {
/* Action */
}⚠️ 注意:需确保
i是数字或可转为字符串的值(如i.toString()),否则可能产生意外结果(如've' + null→'venull')。立即学习“Java免费学习笔记(深入)”;
✅ 方法三:String.prototype.concat()
if (allMusic[indexNumb - 1].lyrics['ve'.concat(i)].stamp) {
/* Action */
}? 语义清晰,但相比模板字面量略显冗长,实用性较低。
? 关键注意事项
-
索引起始问题:原代码中
for (let i = 0; ...)会导致首次尝试访问ve0(不存在),应从i = 1开始; -
健壮性增强:建议添加可选链操作符(
?.)防止lyrics或veX为undefined时抛出错误; -
性能提示:属性名拼接本身开销极小,无需过度优化;但若需高频访问,可预先提取
lyrics引用减少重复路径查找; -
设计反思:长期来看,将
ve1/ve2… 改为数组结构(如lyrics: [{ ls: "..." }, { ls: "..." }])更符合 JSON 规范与 JavaScript 惯例,便于遍历、增删和序列化。
综上,优先使用模板字面量 ['ve${i}'] ——它既符合现代 JavaScript 最佳实践,又兼顾可维护性与可读性。动态属性访问不是“魔法”,而是理解对象本质与语法特性的自然延伸。


















