能否从对象属性值提取对应变量名字符串?是否可行可取?
问题解答:能否通过变量值获取其原始变量名?
问题描述
你想要实现一个magicalFunc函数,能通过变量的值反向获取它的原始变量名,示例如下:
const myLovelyArray= [3,1,5,10] const myObject = {property1 :myLovelyArray} console.log( magicalFunc(myObject.property1) ) // 期望输出: "myLovelyArray"
同时你尝试了ChatGPT推荐的代码,但无法正常工作:
function variableNameExtractor(variable) { const regex = /^[a-zA-Z_$][a-zA-Z0-9_$]*/; const match = regex.exec(variable.toString()); return match ? match[0] : null; } const myVariable = 2; const variableName = variableNameExtractor(myVariable); console.log(variableName); // 输出 null
功能可行性分析
结论:这种功能在JavaScript中无法实现,核心原因:
- JavaScript采用值传递(引用类型传递的是引用地址),变量名只是代码编写阶段的标识符,运行时不会将变量名和对应的值/引用绑定。当你传递
myObject.property1给函数时,函数拿到的只是数组的引用,完全不知道这个引用曾经被命名为myLovelyArray。 - 同一个值/引用可以被多个变量指向,比如
const anotherArr = myLovelyArray,此时同一个数组对应两个变量名,函数根本无法确定要返回哪一个。
你测试的代码之所以失效,是因为逻辑完全错误:
- 传递基本类型值(如
2)时,variable.toString()得到"2",正则匹配的是字母下划线开头的标识符,自然匹配失败返回null; - 传递数组时,
[3,1,5,10].toString()得到"3,1,5,10",同样不符合正则规则,也会返回null。
是否值得采用这种功能?
完全不值得,理由如下:
- 这种需求违背JavaScript的语言设计逻辑,强行实现(比如通过静态代码分析AST)成本极高,且只能覆盖静态编写的代码,无法处理运行时动态赋值的场景;
- 业务逻辑不应该依赖变量名来实现。如果需要将值和某个标识关联,应该显式存储,比如用
{ key: "myLovelyArray", value: [3,1,5,10] }的形式,而非试图从值反向推导变量名。
内容的提问来源于stack exchange,提问作者helloWorldMan
相关产品推荐
相关产品推荐

