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

时间:2011-01-05 08:40:03

标签: javascript

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

我想这样做:

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中: How to get a variable name as a string in PHP?

20 个答案:

答案 0 :(得分:47)

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

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

const someVar = 42
const displayName = varToString({someVar})

答案 1 :(得分:45)

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

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

答案 2 :(得分:28)

在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/

答案 3 :(得分:18)

var x = 2;
for(o in window){ 
   if(window[o] === x){
      alert(o);
   }
}

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

那样做

答案 4 :(得分:18)

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

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

// returns "myFirstName"

答案 5 :(得分:12)

这适用于基本表达式

const nameof = exp => exp.toString().match(/[.](\w+)/)[1];

实施例

nameof(() => options.displaySize);

段:



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




答案 6 :(得分:7)

var somefancyvariable = "fancy";
keys({somefancyvariable})[0];

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

//THIS DOESN'T WORK
function getVarName(v) {
    return keys({v})[0];
}
//returns "v"

答案 7 :(得分:7)

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

const nameOf = (f) => (f).toString().replace(/[ |\(\)=>]/g,'');

示例:

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

答案 8 :(得分:7)

由于 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);

答案 9 :(得分:5)

为了安全起见,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'"

答案 10 :(得分:3)

当一个函数编写一个改变不同全局变量值的函数时,它并不总是myfirstname,而是它正在经历的任何事情。试试这个对我有用。

jsfiddle

中运行
var jack = 'jill';
function window_getVarName(what)
{
  for (var name in window)
  {
    if (window[name]==what)
    return(name);
  }
  return("");
}
document.write(window_getVarName(jack));

将写入窗口' jack'。

答案 11 :(得分:3)

到目前为止,我发现了将变量名称作为字符串获取的快捷方式:

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

const whatsMyName = "Snoop Doggy Dogg";

console.log( "Variable name is: " + name({ whatsMyName }) );
//result: Variable name is: whatsMyName

答案 12 :(得分:3)

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

在全局范围内获取多个变量名称的示例

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

// pass all varibles you want in object
function getVarsNames(v = {}){
    // getting keys or names !
    let names = Object.keys(v);
    // return array has real names of varibles 
    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]

答案 13 :(得分:2)

我需要这个,不想使用对象,并想出了以下解决方案,转过来解决问题。

我没有将变量名称转换为字符串,而是将字符串转换为变量。

仅当变量名称已知时才有效。

拿这个:

var height = 120;
testAlert(height);

这应显示:

height: 120

这可以这样做:

function testAlert(ta)
{
    a = window[ta];
    alert(ta + ': ' + a); 
}

var height = 120;
testAlert("height");
// displays: height: 120

所以我使用字符串"height"并使用height命令将其转换为变量window[]

答案 14 :(得分:2)

如果您正在寻找快速而肮脏的东西,这可能会奏效:

var zox = 150;

cl("zox");

function cl(c) {
    console.log(c + ': ' + this[c]); // zox: 150    
}

答案 15 :(得分:1)

你可以在javascript中反思类型并获取属性和方法的名称,但是你需要的是像.NET中的 Lambda Expressions Trees ,我认为它不是可能由于动态特性和javascript中缺少静态类型系统。

答案 16 :(得分:0)

这可以在Internet Explorer(9、10和11),Google Chrome 5中使用:

   
var myFirstName = "Danilo";
var varName = Object.keys({myFirstName:0})[0];
console.log(varName);

浏览器兼容性表:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

答案 17 :(得分:0)

有人建议,我已经基于JSON创建了此函数,可以很好地满足我的调试需求

function debugVar(varNames){
let strX = "";
function replacer(key, value){
    if (value === undefined){return "undef"}
    return value
    }    
for (let arg of arguments){
let lastChar;
    if (typeof arg!== "string"){
        let _arg = JSON.stringify(arg, replacer);
        _arg = _arg.replace('{',"");
        _arg = _arg.replace('}',"");            
        _arg = _arg.replace(/:/g,"=");
        _arg = _arg.replace(/"/g,"");
        strX+=_arg;
    }else{
    strX+=arg;
    lastChar = arg[arg.length-1];
    }
    if (arg!==arguments[arguments.length-1]&&lastChar!==":"){strX+=" "};
}
console.log(strX)    
}
let a = 42, b = 3, c;
debugVar("Begin:",{a,b,c},"end")

答案 18 :(得分:0)

对于那些为了调试目的而想打印 variableName 和 variableValue 的人,这里有一个函数:

function PreencherColunasDados () {

var DadosLeads = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Dados');

DadosLeads.getActiveCell();
DadosLeads.getRange('A1').activate();
DadosLeads.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.DOWN).activate();

var Linha = DadosLeads.getCurrentCell().getRow();

DadosLeads.getActiveCell().offset(0,9).activate()

DadosLeads.getCurrentCell().offset(-1, 0).activate();
var destinationRange = DadosLeads.getActiveRange().offset(0, 0, 2);
DadosLeads.getActiveRange().autoFill(destinationRange, SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
DadosLeads.getCurrentCell().offset(1, 0).activate();
  
DadosLeads.getActiveCell().offset(0,1).activate()

DadosLeads.getCurrentCell().offset(-1, 0).activate();
var destinationRange = DadosLeads.getActiveRange().offset(0, 0, 2);
DadosLeads.getActiveRange().autoFill(destinationRange, SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
DadosLeads.getCurrentCell().offset(1, 0).activate();
  
DadosLeads.getActiveCell().offset(0,1).activate()

DadosLeads.getCurrentCell().offset(-1, 0).activate();
var destinationRange = DadosLeads.getActiveRange().offset(0, 0, 2);
DadosLeads.getActiveRange().autoFill(destinationRange, SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
DadosLeads.getCurrentCell().offset(1, 0).activate();

}

示例:

const printNameValue = (v)=> { var varName = (v).toString().replace(/[ |\(\)=>]/g, '') var varValue = (v)() // neat : console.log(varName,varValue); // with some coloring : console.log("\033[1;96m[\033[1;33m " + varName + " :\033[0;0m " + varValue+"\033[1;96m ]\033[0;0m"); }
调用:
const myNiceVariable = 1234
结果: display with colors in the terminal

答案 19 :(得分:-4)

不,没有。
此外,如果您可以编写variablesName(myFirstName),则您已经知道变量名称(“myFirstName”)。