变量名称作为Javascript中的字符串

fis*_*ato 134 javascript

有没有办法在Javascript中将变量名称作为字符串?(比如Cocoa中的NSStringFromSelector)

我想这样做:

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

--> myFirstName:John
Run Code Online (Sandbox Code Playgroud)

- 添加

我正在尝试使用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();

...
Run Code Online (Sandbox Code Playgroud)

....

[来自其他节目]

evaluateJavascriptInBrowser("(instanceName).someMethod("resultA");");
Run Code Online (Sandbox Code Playgroud)

在PHP中:如何在PHP 中将变量名称作为字符串?

Don*_*uts 65

像Seth的回答一样,但Object.keys()改为使用:

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

const someVar = 42
const displayName = varToString({ someVar })
console.log(displayName)
Run Code Online (Sandbox Code Playgroud)

  • @titusfx,您可以将const换成let或var,它的工作原理相同。但是,如果您首先使用Transpiler进行对象分解,则它可能已经支持const。 (5认同)
  • @O'Rooney 是的,它是 ES6 特定的。 (2认同)

kar*_*m79 52

通常,您可以将哈希表用于要将名称映射到某个值的情况,并且能够检索两者.

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

  • 但是不回答这个问题. (78认同)
  • 我认为这个“没有回答问题”的唯一原因是因为它不是以“你无法在 JavaScript 中获取常量或变量的名称。最接近你想要的东西......”开头,就像其他答案:/sf/answers/2617557561/ (3认同)
  • @Mat 我理解代码,但通常 OP 问题用于更复杂的动态分配,您可以在其中从生成的字符串中选择变量。或者简单地创建一个字典来打印一个值是矫枉过正的。 (2认同)
  • @htafoya-是的,有点像C#中的nameof(varname)。 (2认同)

Fel*_*ger 40

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

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

// returns "myFirstName"
Run Code Online (Sandbox Code Playgroud)

  • 是否可以创建接受变量并打印其名称的函数?我尝试将您的代码包装在函数中,但 id 返回了我用作参数的名称 (4认同)
  • 该答案类似于[@ SethWhite's](/sf/answers/2776846201/),但已大大简化。谢谢!@bluejayke我认为这个答案要比最初接受的答案晚了几年。但是,是的,目前这是最好的-也许建议使用“ pop()”用法如下(/sf/answers/3804160741/) (2认同)
  • 请注意:例如,如果您在 VS Code 中使用自动重构将“myFirstName”变量重命名为“myLastName”,则此操作将不起作用。它将执行以下操作:`Object.keys({ myFirstName: myLastName })[0];` (2认同)

Set*_*ite 36

在ES6中,您可以编写如下内容:

let myVar = 'something';
let nameObject = {myVar};
let getVarNameFromObject = (nameObject) => {
  for(let varName in nameObject) {
    return varName;
  }
}
let varName = getVarNameFromObject(nameObject);
Run Code Online (Sandbox Code Playgroud)

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

这利用了ES6的对象解构.

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

  • @LaurenceLord称为属性简写。分配没有定义的对象属性(某事:“ asdf”),将导致JS用变量名称及其值{something} === {something:something}定义该属性。https://ariya.io/2013/02/es6-and-object-literal-property-value-shorthand (2认同)
  • MDN 链接到“简写属性名称” - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#new_notations_in_ecmascript_2015 (2认同)

clo*_*ink 18

var x = 2;
for(o in window){ 
   if(window[o] === x){
      alert(o);
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,我认为你应该像"karim79"那样做

  • 这仅适用于窗口范围(在函数内部时中断). (8认同)
  • 同意 - 但它最接近于回答 OP 的问题。吉。 (2认同)

Bru*_*oLM 16

这适用于基本表达式

const nameof = exp => exp.toString().match(/[.](\w+)/)[1];
Run Code Online (Sandbox Code Playgroud)

nameof(() => options.displaySize);
Run Code Online (Sandbox Code Playgroud)

片段:

var nameof = function (exp) { return exp.toString().match(/[.](\w+)/)[1]; };
var myFirstName = 'Chuck';
var varname = nameof(function () { return window.myFirstName; });
console.log(varname);
Run Code Online (Sandbox Code Playgroud)

  • 这实际上效果很好!唯一的问题是,当您传递这样的内容时:nameof(()=> options.subOptions.displaySize)返回“ subOptions”,而是使用此正则表达式:exp.toString()。match(/(?? [[^ 。] * $)(\ w +)/ g)[0] (2认同)

Jua*_*dán 10

为了安全起见,pop可能比用[0]索引更好(为了安全起见,变量可能为null)。

const myFirstName = 'John'
const variableName = Object.keys({myFirstName}).pop();
console.log(`Variable ${variableName} with value '${variable}'`);

// returns "Variable myFirstName with value 'John'"
Run Code Online (Sandbox Code Playgroud)

  • 如果 myFirstName 作为参数 v 传递给函数(包含此代码),则变量名称将报告为 v 而不是 myFirstName。 (4认同)

wco*_*der 10

从任何有效的 Javascript(变量、类)中获取字符串:

const nameOf = (f) => (f).toString().replace(/[ |\(\)=>]/g,'');
Run Code Online (Sandbox Code Playgroud)

例子:

nameOf(() => myVariable)             // myVariable
nameOf(() => myVariable.name)        // myVariable.name
nameOf(() => myVariable.name.length) // myVariable.name.length
nameOf(() => myVariable.name[10])    // myVariable.name[10]
nameOf(() => MySuperClass)           // MySuperClass
Run Code Online (Sandbox Code Playgroud)

  • 这真是天才! (2认同)

Cad*_*boo 7

var somefancyvariable = "fancy";
Object.keys({somefancyvariable})[0];
Run Code Online (Sandbox Code Playgroud)

这不能成为函数,因为它返回函数变量的名称

// THIS DOESN'T WORK
function getVarName(v) {
    return Object.keys({v})[0];
}
// Returns "v"
Run Code Online (Sandbox Code Playgroud)

  • 它应该像这样 `const getVarName = (v) => Object.keys(v)[0];` 然后调用像这样 `getVarName({whatEverVariable})` 的函数 (2认同)

Seb*_*opp 7

到目前为止,我发现将变量名称作为字符串获取的最短方法:

const name = obj => Object.keys(obj)[0];

const whatsMyName = "Snoop Doggy Dogg";

console.log( "Variable name is: " + name({ whatsMyName }) );
//result: Variable name is: whatsMyName
Run Code Online (Sandbox Code Playgroud)


Ben*_*uer 6

ECMAScript 5.1开始,您可以使用Object.keys从对象中获取所有属性的名称.

这是一个例子:

// Get John’s properties (firstName, lastName)
var john = {firstName: 'John', lastName: 'Doe'};
var properties = Object.keys(john);

// Show John’s properties
var message = 'John’s properties are: ' + properties.join(', ');
document.write(message);
Run Code Online (Sandbox Code Playgroud)


ouc*_*exe 5

使用 Object.keys() 的最佳方法;

示例:用于在全局范围内获取多变量名称

// multi variables for testing
var x = 5 , b = true , m = 6 , v = "str";

// pass all variables you want in object
function getVarsNames(v = {}){
    // getting keys or names !
    let names = Object.keys(v);
    // return array contain all names of variables 
    return names;
}

// testing if that work or not 
let VarsNames = getVarsNames({x , b , m , v});

console.log(VarsNames); // output is array [x , b , m , v]
Run Code Online (Sandbox Code Playgroud)