Имя переменной в виде строки в Javascript

Есть ли способ получить имя переменной в виде строки в 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?

21 ответ

Решение

Как правило, вы используете хеш-таблицу для ситуации, когда вы хотите сопоставить имя с каким-либо значением и иметь возможность получить оба.

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

Вы можете использовать следующее решение для решения вашей проблемы:

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

// returns "myFirstName"

Как ответ Сета, но использует Object.keys() вместо:

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

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

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

Получите строку из любого допустимого 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

Возможно, pop будет лучше, чем индексирование с помощью [0], для безопасности (переменная может быть нулевой).

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

// returns "Variable myFirstName with value 'John'"
var x = 2;
for(o in window){ 
   if(window[o] === x){
      alert(o);
   }
}

Тем не менее, я думаю, что вы должны сделать как "karim79"

Это работает для основных выражений

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

пример

nameof(() => options.displaySize);

Snippet:

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

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

это не может быть превращено в функцию, так как возвращает имя переменной функции

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

Я нашел короткий способ получить имя переменных в виде строки:

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

const whatsMyName = "Snoop Doggy Dogg";

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

Лучший способ использовать 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]

Начиная с 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);

для тех, кто хочет напечатать variableName и variableValue для отладки,
вот функция:

      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 const myNiceVariable = 1234
вызов:
printNameValue(()=> myNiceVariable )
результат:

Когда есть функция, пишите функцию, которая изменяет различные значения глобальных переменных, это не всегда 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));

Пишет в окошко "домкрат".

Это работало с использованием 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

Если вы ищете что-то быстрое и грязное, это может сработать:

      var zox = 150;

cl("zox");

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

Вы можете поразмышлять о типах в javascript и получить имя свойств и методов, но вам нужно вот что Lambda Expressions Trees в.NET я думаю, что это невозможно из-за динамического характера и отсутствия статической системы типов в javascript.

Я нуждался в этом, не хотел использовать объекты и придумал следующее решение, перевернув вопрос.

Вместо преобразования имени переменной в строку, я конвертирую строку в переменную.

Это работает, только если имя переменной известно, конечно.

Возьми это:

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[] команда.

Я создал эту функцию на основе 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")

Я думаю, это то, что вы ищете:

      var myFirstName = 'John';
const [myFirstNameVar] = Object.keys({myFirstName});
alert(myFirstNameVar + ":" + myFirstName);

теперь myFirstNameVar содержит имя переменной/константы «myFirstName». А поскольку это деструктуризация массива, то в одну строку кода можно добавить больше имен и переменных.

      const [myFirstNameVar, myLastNameVar] = Object.keys({myFirstName, myLastName});

Нет, нет
Кроме того, если вы можете написать variablesName(myFirstName)Вы уже знаете имя переменной ("myFirstName").

Другие вопросы по тегам