
本文详解如何在 javascript 中通过变量名动态访问对象属性,避免因错误使用点号(.)操作符导致的“undefined is not iterable”等运行时错误,并给出安全、可维护的解决方案。
本文详解如何在 javascript 中通过变量名动态访问对象属性,避免因错误使用点号(.)操作符导致的“undefined is not iterable”等运行时错误,并给出安全、可维护的解决方案。
在 JavaScript 中,当需要根据变量值动态访问对象的某个属性(例如 json.test),绝不能直接使用点号语法 json.VARIABLE_NAME——因为这会字面查找名为 "VARIABLE_NAME" 的属性,而非读取变量 VARIABLE_NAME 所存储的字符串值(如 "test")。这是初学者常见的误解,也是引发 Cannot read property 'filter' of undefined 错误的根本原因。
✅ 正确做法是使用方括号表示法(bracket notation),它支持运行时计算的属性名:
const VARIABLE_NAME = 'test'; // 注意:字符串字面量,非未声明变量
const results = json[VARIABLE_NAME].filter((result) => {
return result.status === 'active';
});⚠️ 关键注意事项:
- VARIABLE_NAME 必须是字符串类型(如 'test'),而非未加引号的标识符(如 test),否则会尝试读取全局变量 test,极易报错;
- 访问前建议校验属性是否存在且为数组,提升健壮性:
if (Array.isArray(json[VARIABLE_NAME])) {
const results = json[VARIABLE_NAME].filter(result => result.id > 100);
console.log(results);
} else {
console.warn(`Expected array at json[${VARIABLE_NAME}], but got`, json[VARIABLE_NAME]);
}? 进阶提示:若需频繁进行此类动态访问,可封装为工具函数,支持默认值与类型断言:
立即学习“Java免费学习笔记(深入)”;
const safeFilter = (obj, key, predicate) => {
const arr = obj?.[key];
return Array.isArray(arr) ? arr.filter(predicate) : [];
};
// 使用示例
const results = safeFilter(json, VARIABLE_NAME, r => r.enabled);总结:动态属性访问必须用 obj[variable],而非 obj.variable;结合类型检查与防御性编程,可显著提升代码可靠性与可维护性。










