
本文介绍如何用对象字面量替代冗长的 if/else 判断,实现通过字符串变量(如 'minor'、'major')安全、可扩展地动态访问对应数组,避免硬编码分支,提升音阶生成类应用的可维护性。
本文介绍如何用对象字面量替代冗长的 if/else 判断,实现通过字符串变量(如 'minor'、'major')安全、可扩展地动态访问对应数组,避免硬编码分支,提升音阶生成类应用的可维护性。
在音乐理论工具或音阶生成器等 JavaScript 应用中,常需根据用户选择(如点击“小调”按钮)动态读取不同音程模式数组(如 minor、major、pentatonic、dorian 等)。若沿用 if (keyScale === 'minor') { ... } else if (keyScale === 'major') { ... } 的方式,每新增一种调式就得扩写一个分支——不仅代码臃肿,更易出错且难以维护。
推荐方案:使用命名空间对象统一管理数组
将所有音阶数组作为属性挂载到一个普通对象中,利用方括号语法 obj[key] 实现动态属性访问:
const notes = ['A','A#','B','C','C#','D','D#','E','F','F#','G','G#','A','A#','B','C','C#','D','D#','E','F','F#','G','G#','A'];
const minor = [0, 2, 3, 5, 7, 8, 10, 12];
const major = [0, 2, 4, 5, 7, 9, 11, 12];
const dorian = [0, 2, 3, 5, 7, 9, 10, 12]; // 示例:新增调式,无需改逻辑
// ✅ 统一注册所有音阶数组
const scales = {
minor,
major,
dorian
// 后续只需在此追加:phrygian: [...], lydian: [...]
};
// ✅ 动态获取目标音阶数组
let keyRoot = 5;
let keyScale = 'minor'; // 可来自按钮 click 事件:e.target.dataset.scale
let output = '';
for (let i = 0; i <p><strong>注意事项与最佳实践:</strong></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5703" title="deep-java-review"><img
src="https://img.php.cn/upload/skill/000/000/081/179060057413304.jpg" alt="deep-java-review" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5703" title="deep-java-review" class="overflowclass">deep-java-review</a>
<p class="overflowclass">Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...</p>
</div>
<a rel="nofollow" href="/xiazai/skill5703" title="deep-java-review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
-
? 安全性校验:生产环境建议增加存在性检查,防止因传入非法 keyScale(如 'blues' 但未定义)导致运行时错误:
const scaleArray = scales[keyScale]; if (!Array.isArray(scaleArray)) { throw new Error(`Unknown scale: ${keyScale}`); } ? 模块化延伸:当音阶数量增长,可将 scales 对象拆分为独立模块(如 scales.js),配合 ES 模块按需导入,保持主逻辑清爽。
⚠️ 避免使用 eval() 或 window[keyScale]:前者存在严重安全与性能风险;后者依赖全局作用域,违背封装原则且不可靠(严格模式下失效)。
此方案以极简结构实现高内聚、低耦合的设计目标——新增调式只需在 scales 对象中添加一行,核心循环逻辑零修改,真正践行“开闭原则”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










