Имя переменной в виде строки в 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");");
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").