JS技术问题:将含[*]的字符串转为变量名存入对象且不执行数组引用
解决方法:延迟求值,保留变量引用
我明白你的需求了——你想把字符串 "srcs[14]" 转换成变量引用的形式存入对象,但不想立即获取 srcs[14] 的实际值,只是保留这个变量的“指向关系”。eval() 之所以不行,是因为它会立刻执行表达式并返回结果,不符合你的要求。下面给你两种可行的方案:
方案一:使用Getter属性
这种方式可以让你延迟到实际访问avatar属性时才去获取srcs[14]的值,而且每次访问都会拿到最新的srcs[14]:
// 假设你的srcs数组已经在外部定义 const srcs = ['图片1', '图片2', ..., '图片14']; // 示例数组 // 构建目标对象 const nurseListSpeciality = [{ get avatar() { return srcs[14]; } }]; // 使用方式:只有当你访问avatar时才会求值 console.log(nurseListSpeciality[0].avatar); // 此时才会获取srcs[14]的当前值
方案二:用函数包裹表达式
如果你希望手动控制求值时机,可以把表达式包裹在函数里。这样对象里存储的是一个函数,只有当你主动调用它时,才会去获取srcs[14]的值:
const exprStr = "srcs[14]"; // 从API拿到的字符串 const nurseListSpeciality = [{ avatar: () => eval(exprStr) }]; // 使用方式:调用函数来获取值 console.log(nurseListSpeciality[0].avatar()); // 此时才会执行eval并返回srcs[14]的值
如果担心eval的安全性,也可以用new Function来替代,它会在独立作用域中执行表达式:
const exprStr = "srcs[14]"; const getAvatar = new Function('', `return ${exprStr}`); const nurseListSpeciality = [{ avatar: getAvatar }]; // 使用方式 console.log(nurseListSpeciality[0].avatar());
补充说明
- 如果你只是想把字符串
"srcs[14]"原封不动地存入对象,直接赋值即可:{ avatar: "srcs[14]" }——但从你的需求描述来看,你要的是变量引用而非字符串本身。 - 两种方案都能实现“不立即执行数组引用”的核心需求,选择哪种取决于你后续的使用场景:Getter更贴近普通属性的使用体验,函数包裹则更灵活可控。
内容的提问来源于stack exchange,提问作者gileneusz
相关产品推荐
相关产品推荐

