Javascript: ссылка на имя переменной из самой переменной
Я хочу создать быструю функцию, которая будет console.log
имя переменной и значение. Я хотел бы, чтобы результат функции отображался в консоли: foo: bar
,
Моя основная идея для функции выглядит следующим образом:
function varlog(var_name)
{
console.log(var_name + ": " + eval(var_name));
}
И я бы назвал это так:
function someRandomFunction()
{
var foo = "bar";
// ... some stuff happens
varlog("foo");
}
Это работает, если foo
является глобальным, но не работает в приведенном примере. Другой вариант, который также работает только в глобальном масштабе, использует window[var_name]
вместо страшного eval
,
Я не думаю, что то, что я спрашиваю, возможно, но я решил выбросить это там.
Я провожу много времени, пытаясь быть ленивым. Мой текущий метод просто console.log('foo: ' + bar);
который работает просто отлично. Но сейчас я просто хочу знать, возможно ли это.
Некоторые другие вопросы, на которые я ссылался при поиске этого / создании того, что у меня есть сейчас:
- Имя переменной в виде строки в Javascript
- Как преобразовать имя переменной в строку в JavaScript?
- JavaScript, ссылаться на переменную, используя строку, содержащую ее имя?
- Как найти переменную JavaScript по ее имени
-
Изменить: я хотел бы просто позвонить varlog(foo)
, если имя "foo" может быть получено из переменной.
6 ответов
Причина этого не в том, что переменная foo
недоступен для функции varlog
! foo
объявляется в someRandomFunction и никогда не передается в varlog
, так varlog
понятия не имеет, что такое переменная foo! Вы можете решить эту проблему, передав переменную foo
в функцию (или используя какое-то закрытие, чтобы сделать foo
в объеме varlog
) вместе с его строковым представлением, но в остальном, я думаю, вам не повезло.
Надеюсь это поможет.
Решение - (для вашего реального случая использования) - console.log({foo})
В ES6 IdentifierReference
с принимаются как PropertyDefinition
на ObjectLiteral
"s PropertyDefinitionList
( см. таблицу совместимости):
Имя переменной устанавливается на Object
"s Property
"s key
и значение переменной устанавливается на Object
"s Property
"s value
,
Как console.log
шоу Object
с их Propertiy
/ е годы key
с и value
s вы можете использовать это, чтобы увидеть имя и значение вашей переменной, вызвав console.log({foo})
,
Обратите внимание, что при инициализации одного анонимного
object
с несколькими переменными, как я сделал во второмconsole.log
хотя они отображаются в том же порядке, что и инициализированы здесь в выводе фрагмента, они могут быть переупорядочены (в алфавитном порядке) в другом месте.
var testint = 3
var teststring = "hi"
var testarr = ["one", 2, (function three(){})]
var testobj = {4:"four", 5:"five", nested:{6:"six",7:"seven"}}
console.log({testint})
console.log({testint, teststring, testarr, testobj})
Ответ - (к названию вопроса) - Object.keys({foo})[0]
Вы также можете использовать эту стенографию Object Initializer
вместе с Object.keys()
для прямого доступа к имени переменной:
var name = "value"
console.log(Object.keys({name})[0])
Хотя я не знаю о такой возможности, я хотел бы поделиться небольшой идеей:
Object.prototype.log = function(with_message) {
console.log(with_message + ":" + this);
}
var x = "string";
x.log("x");
Как я уже сказал, маленькая идея.
Вид объединения пары ответов в маленькую функцию
Будет ли это работать для вас?
const log = function() {
const key = Object.keys(this)[0];
const value = this[key];
console.log(`${key}: ${value}`);
}
let someValue = 2;
log.call({someVlaue}); //someValue: 2
Работает с функцией тоже, даже сама.
log.call({log});
// It would return the following
log:function() {
const key = Object.keys(this)[0];
const value = this[key];
console.log(`${key}: ${value}`);
}
Я не верю, что то, что ты хочешь сделать, возможно.
Лучшая альтернатива, которую я могу придумать, - передать объект varlog
это в основном хэш-ключ-значение:
function varlog(obj)
{
for (var varname in obj) {
console.log(varname + ": " + obj[varname]);
}
}
function someRandomFunction()
{
var foo = "bar";
// ... some stuff happens
varlog({foo: foo});
}
Удивлен, что пока нет супер простого решения.
let varname = "banana"
console.log(`${JSON.stringify({varname}).split('"')[1]}`)
Печать varname
в консоли
Мне понравилась идея @mhitza, поэтому я делаю ее немного больше...
Недостатком является необходимость использования .value
чтобы достичь переменной содержимого.
Object.prototype.log = function(message) {
if (message) console.log(this.name, this.value, message);
else console.log(this.name, this.value);
}
function nar (name, value) {
var o = {name: name, value: value};
this[name] = o;
return o;
}
// var globalVar = 1;
nar('globalVar', 1);
globalVar.log();
// > globalVar 1
globalVar.value += 5;
globalVar.log('equal six');
// > globalVar 6 equal six
var someFunction = function () {
// var localVar = 2;
nar('localVar', 2);
localVar.log('someInfo');
// > localVar 2 someInfo
};
someFunction();