Javascript: ссылка на имя переменной из самой переменной - PullRequest
20 голосов
/ 22 марта 2011

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

Некоторые другие вопросы, на которые я ссылался при поиске этого / создании того, что у меня сейчас:

-

Редактировать: Я хотел бы просто позвонить varlog(foo), если имя "foo" может быть получено из переменной.

Ответы [ 7 ]

14 голосов
/ 23 марта 2017

Решение - (для вашего реального случая использования) - console.log({foo})

In ES6 IdentifierReference с принимаются как PropertyDefinition с ObjectLiteral * PropertyDefinitionList ( см. Таблицу совместимости ):

Переменная имя устанавливается на Object Property 'key
и переменная значение устанавливается в Object '* Property' * value.

Поскольку console.log показывает Object s с их Propertiy / s 'key s и value s, вы можете использовать это, чтобы увидеть обе переменные name и значение путем вызова 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])
6 голосов
/ 22 марта 2011

Причина, по которой это не работает, заключается в том, что переменная foo недоступна для функции varlog!foo объявлено в someRandomFunction и никогда не передается в varlog, поэтому varlog понятия не имеет, что такое переменная foo!Вы можете решить эту проблему, передав переменную foo в функцию (или используя какое-то замыкание, чтобы сделать foo в области действия varlog) вместе с ее строковым представлением, но в противном случае, я думаю, что вы вышли изудачи.

Надеюсь, это поможет.

3 голосов
/ 22 марта 2011

Пока я не знаю о такой возможности, я хотел бы поделиться небольшой идеей:

Object.prototype.log = function(with_message) {
  console.log(with_message + ":" + this);
}

var x = "string";
x.log("x");

Как я уже сказал, маленькая идея.

2 голосов
/ 22 марта 2011

Я не верю, что то, что вы хотите сделать, возможно.

Лучшая альтернатива, которую я могу придумать, - это передать объект в 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});
}
0 голосов
/ 13 июня 2019

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

var name = "John"; //Original. No way to get the name

var name = ["John", "name"]; /*My way. Variable input will be at name[0] and name
name[1] */

Если ваша переменная уже является массивом, просто добавьте имя к последней позиции в массиве.

0 голосов
/ 12 сентября 2018

Вид объединения пары ответов в небольшую функцию

Будет ли это работать для вас?

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}`);
}
0 голосов
/ 23 октября 2016

Мне понравилась идея @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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...