JavaScript中如何用for循环遍历类实例动态初始化的变量名和值
问题场景
我正在开发一款解释器,可从文本文件中读取如下格式的变量配置内容:
variable1: 2 variable2: 400 variable3: 31
目前我借助eval()和正则表达式在运行时完成变量初始化,相关实现代码如下:
class Rules{ getSegmentArgs_string(sgmnt, scope) { let argarray = new Array; let vardeclaration; for(let i=0; i<this.rules[sgmnt].length; i++) { let regexp = /(\w+): ([0-9\.]+)/g; for (const match of this.rules[sgmnt][i].matchAll(regexp)) { vardeclaration = (scope+match[1].toString() + " = "+match[2].toString()+";"); argarray[i] = vardeclaration; } } return argarray; } setSegment(sgmnt) { this.segment = sgmnt; } init() { this.defaultvars = this.getSegmentArgs_string(this.segment,"this.") for(let i=0; i<this.defaultvars.length; i++) { eval(this.defaultvars[i]); } delete(this.rules); delete(this.defaultvars); delete(this.segment); } constructor() { this.rules = this.dump(); } } let rules = new Rules; rules.setSegment(3); rules.init();
现在遇到的问题是:初始化完成后,我无法通过for循环访问这些动态生成的变量,批量输出每个变量的名称及其对应值。我之前尝试编写的遍历代码如下,运行后无法得到正确结果:
for (const variables in rules) { console.log({variales}); console.log({variables}.value); }
我可以通过硬编码变量名的方式正常访问变量值:
console.log(rules.variables1,rules.variables2,rules.variables3)
但受任务性质限制,我不能硬编码变量名,需要通过循环遍历的方式获取所有动态生成的变量。
解决方法
你写的遍历代码有两处错误:
- 存在拼写错误:
{variales}漏写了字符,正确的变量名是variables - 取值逻辑错误:
for...in循环遍历对象时,拿到的是对象的属性名字符串,要获取对应属性值需要用方括号取值语法对象[属性名],你写的{variables}.value是无效语法。
直接替换成如下遍历代码即可正常输出所有动态变量:
for (const varName in rules) { console.log('变量名:', varName); console.log('变量值:', rules[varName]); }
你的init方法执行时已经手动删除了rules、defaultvars、segment这几个内部属性,遍历rules实例得到的可枚举属性全是你从配置文件解析出来的动态变量,不会混入其他内部字段。
如果后续需要给Rules类新增其他实例方法或属性,怕遍历的时候混入非配置变量,可以在解析变量阶段单独维护一个配置变量名列表,遍历的时候只读取列表里的字段即可,逻辑会更稳妥。
内容的提问来源于stack exchange,提问作者Imforpeace
相关产品推荐
相关产品推荐

