变量名作为 Javascript 中的字符串

IT技术 javascript
2021-01-14 17:21:44

有没有办法在Javascript中将变量名作为字符串获取?(就像NSStringFromSelector可可中

我想这样做:

var myFirstName = 'John';
alert(variablesName(myFirstName) + ":" + myFirstName);

--> myFirstName:John

更新

我正在尝试使用 JavaScript 连接浏览器和另一个程序。我想将实例名称从浏览器发送到另一个程序以进行回调方法:

FooClass = function(){};
FooClass.someMethod = function(json) {
  // Do something
}

instanceA = new FooClass();
instanceB = new FooClass();
doSomethingInAnotherProcess(instanceB); // result will be substituted by using instanceB.someMethod();

...

从另一个程序:

evaluateJavascriptInBrowser("(instanceName).someMethod("resultA");");

在 PHP 中:如何在 PHP 中以字符串形式获取变量名?

6个回答

像赛斯的回答,但使用Object.keys()

const varToString = varObj => Object.keys(varObj)[0]

const someVar = 42
const displayName = varToString({ someVar })
console.log(displayName)

这似乎取决于使用ES6?
2021-03-11 17:21:44
好主意。有了这个,我们可以创建一个能够按值设置多个输出的函数,从终端参数中读取:const getArgs = (varObj:any) => { const keys = Object.keys(varObj); process.argv.slice(2).forEach((arg, i) => varObj[keys[i]] = arg); return varObj; }
2021-03-12 17:21:44
@titusfx 你可以把 c​​onst 换成 let 或 var ,它的工作原理是一样的。但是,如果您首先使用转译器进行对象解构,它可能已经支持 const。
2021-03-20 17:21:44
@O'Rooney 是的,它是特定于 ES6 的。
2021-04-07 17:21:44

您可以使用以下解决方案来解决您的问题:

const myFirstName = 'John'
Object.keys({myFirstName})[0]

// returns "myFirstName"
这个答案类似于 [@SethWhite's] ( stackoverflow.com/a/39669231/5876282 ),但简化了很多。谢谢!@bluejayke 我认为这个答案是在最初接受的答案几年后出现的。但是,是的,目前这是最好的 - 除了下面建议的“pop()”用法
2021-03-19 17:21:44
是否可以制作接受变量并打印其名称的函数?我试过将您的代码包装在一个函数中,但 id 返回了我用作参数的名称
2021-03-26 17:21:44
@WakanTanka 如果你提出一个合适的问题,我会在那里回答。
2021-03-26 17:21:44
@WakanTanka 不,那行不通。正如您所发现的,它只会打印您为函数参数提供的名称。我认为了解这样的函数如何编译为较旧的 Javascript 规范会有所帮助。您可以在此示例 ( jsfiddle.net/bigpopakap/wq891ghr/2 ) 中看到 {variable} 语法只是 {variable: variable} 的缩写,因此无法使用调用函数中的变量名称
2021-03-28 17:21:44
注意:例如,如果您在 VS Code 中使用自动重构将myFirstName变量重命名myLastName这将不起作用它会这样做:Object.keys({ myFirstName: myLastName })[0];
2021-04-04 17:21:44

通常,在希望将名称映射到某个值并且能够检索两者的情况下,您会使用哈希表。

var obj = { myFirstName: 'John' };
obj.foo = 'Another name';
for(key in obj)
    console.log(key + ': ' + obj[key]);

我认为这个“不回答问题”的唯一原因是因为它不是以“你无法在 JavaScript 中获得常量或变量的名称。最接近你想要的东西......”,比如另一个答案:stackoverflow.com/a/37393679
2021-03-16 17:21:44
@htafoya:间接地,是的 - 的所有属性objname: value成对打印但解释性文字可能更清楚。
2021-03-20 17:21:44
虽然不回答问题。
2021-03-25 17:21:44
@htafoya - 是的,就像 C# 中的 nameof(varname) 一样简单。
2021-03-25 17:21:44
@Mat 我理解代码,但通常 OP 问题用于更复杂的动态分配,您可以在其中从生成的字符串中选择变量。或者简单地创建一个字典来打印一个值是矫枉过正的。
2021-03-31 17:21:44

在 ES6 中,你可以这样写:

let myVar = 'something';
let nameObject = {myVar};
let getVarNameFromObject = (nameObject) => {
  for(let varName in nameObject) {
    return varName;
  }
}
let varName = getVarNameFromObject(nameObject);

不是最好看的东西,但它完成了工作。

这利用了 ES6 的对象解构。

更多信息在这里:https : //hacks.mozilla.org/2015/05/es6-in-depth-destructuring/

你的意思是 !const getVarNameFromObject = (nameObject) => { return Object.keys(nameObject)[0]; };
2021-03-11 17:21:44
2021-03-15 17:21:44
@LaurenceLord旁注:它的“自毁uring ”不“废ING ” :),虽然这并没有特别的“对象”解构它只是“对象文本属性值的简写”赛斯提及。对象解构是 JS 中的一个非常具体的术语,指的是对象的自动解构,例如...var {a,b} = {a: "cool", b: "hot"}等。
2021-03-22 17:21:44
@LaurenceLord 它被称为财产速记。分配一个没有定义的对象属性(something: 'asdf'),将导致 JS 使用变量的名称及其值 {something} === {something:something} 来定义属性。ariya.io/2013/02/…
2021-04-06 17:21:44
很好的答案!!对象破坏的这种特殊用途对我来说是新的(第 2 行let nameObject = {myVar}太有用了!它似乎没有在任何地方记录。有任何链接吗?
2021-04-07 17:21:44
var x = 2;
for(o in window){ 
   if(window[o] === x){
      alert(o);
   }
}

但是,我认为你应该像“karim79”一样

此外,如果您正在测试一个原语,它会提醒所有具有相同值的变量,或者如果两个变量具有分配给它们的相同对象。例如,如果第一行是x = 2; y = 2;或者x = {a:1}; b = x;它会提醒他们每个人
2021-03-11 17:21:44
@aljgom - 好点。这是一个尝试一下小提琴
2021-03-15 17:21:44
同意 - 但它最接近于回答 OP 的问题。吉。
2021-03-18 17:21:44
如果您希望它在函数范围内工作,您可以尝试使用函数名称而不是窗口,例如: var foo = function f(){ f.x = 2; for(o in f){ if(f[o]===f.x) alert(o); } }then call f()will alert 'x'
2021-04-02 17:21:44
这仅适用于窗口范围(在函数内部时中断)。
2021-04-07 17:21:44