Как получить имя переменной в виде строки?

369
02 сентября 2017, 00:58

Не значение переменной, а именно её имя.

Answer 1

Хм, да никак.
Можно, однако, сделать такой финт:

(function() { 
  var getVarName = function tmp(){ 
    let n = /getVarName\(([^)]+?)\)/.exec(tmp.caller !== null ? tmp.caller.toString() : ''); 
     
    return n !== null ? n[1] : false; 
  } 
   
  let myVarName123456 = 1; 
  console.info(getVarName(myVarName123456)); // myVarName123456 
}());

Но это грязный хак, неудобный и больше только "сделать на спор", чем рабочий; в реальном коде даже не знаю кто мог бы это использовать.

Возможно стоит пересмотреть архитектуру Вашего проекта, где используется идентификатор переменной как зависимая величина.
Переменные как раз и придумали чтобы не зависеть от названий.

Answer 2

Переменная не хранит подобную информации о себе, а значит получить ее строковое представление имени у Вас не получится.

Максимум, что вы можете сделать, это зная контекст переменной попытаться получить ее имя через родителя. Да и то, если только эта переменная является ссылочным объектом, а не переменной значения.

function context(){
    this.a = { "test" : "test" };
    for(key in this){
        if(this[key] == a) console.log(key);
    }
}
context(); 
Answer 3

Чтобы получить имя вы должны переменную обернуть объектом, вот так:

<script>
    var myVariable = {};
    myVariable["myVariable"] = 5; // заварачиваем переменную в массив
    myVariable["myVariable"] = 7; // вот так работаем с переменной
    alert(myVariable["myVariable"]); // вот так получаем ее значение
    function getName(arrayVariable){ // функция для извлечения имени
        for (key in arrayVariable)
            return key;
    }
    alert(getName(myVariable)); // извлекаем имя
</script>
Answer 4

Это можно сделать, но переменная должна быть объектом, и ему необходимо дать уникальное свойство или метод по которому его можно будет отличить в списке прочих переменных. Получить и перебрать список переменных, среди которых окажется искомая, внутри документа можно вот так

for (var variable in window) {
    //Анализ variable - она или не она
}

Внутри надо юзать eval и typeof чтобы получить доступ к объекту по его имени и определить наличие уникального свойства/метода. Немного нагружает браузер клиента, зато работает. Протестировано в фоксе.

Вот пример

var Class = function() {
}
Class.prototype.isOurVariable = function() {return true};
var object123 = new Class(); //Ищем имя этой переменной
for (var variable in window) {
    if (!/[a-z]+/.test(variable)) {
        //отсекаем свойства типа "0", есть такие
        continue;
    }
    eval("var ok = (" + variable  + " != null && typeof (" + variable + ".isOurVariable) != 'undefined');");
    if (ok) {console.log(variable); break} 
}
READ ALSO
Неизвестная конструкция объект/json f({&ldquo;a&rdquo;:&ldquo;b&rdquo;})

Неизвестная конструкция объект/json f({“a”:“b”})

Пришлось разбираться в чужом javascript кодеНаткнулся на такого типа конструкцию Имеет вид

377