Javascript:从变量本身引用变量名

时间:2011-03-22 17:28:45

标签: 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);,效果很好。但现在我只想知道这是否可能。

我在搜索/创建现有内容时引用了一些其他问题:

-

编辑:如果名称“foo”可以从变量派生,我很乐意只调用varlog(foo)

8 个答案:

答案 0 :(得分:13)

解决方案 - (针对您的实际使用案例) - console.log({foo})

ES6 IdentifierReferenceObjectLiteral PropertyDefinition PropertyDefinitionList Object上的Property接受为:

变量名称设置为key的{​​{1}} Object
并且变量被设置为Property的{​​{1}}的 value

console.log 显示Object / ies'Propertiykey的{​​{1}}时,你可以使用通过调用 value 来查看变量的名称

  

请注意,使用多个匿名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()

答案 1 :(得分:6)

它不起作用的原因是因为变量foo无法访问函数varlogfoo在someRandomFunction中声明,并且永远不会传递到varlog,因此varlog不知道变量foo是什么!您可以通过将变量foo传递给函数(或使用某种闭包来使foo范围内的varlog)及其字符串表示形式来解决此问题,否则,我觉得你运气不好。

希望这有帮助。

答案 2 :(得分:3)

虽然我不知道这种可能性,但我想分享一个小想法:

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

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

就像我说的,一个小小的想法。

答案 3 :(得分:2)

我不相信你想做的事情是可能的。

我能想到的最好的选择是将对象传递给基本上是键值哈希的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});
}

答案 4 :(得分:0)

我喜欢@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();




答案 5 :(得分:0)

将几个anwer组合成一个小函数的类型

这对您有用吗?

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}`);
}

答案 6 :(得分:0)

我认为没有直接的方法可以完成您所要求的工作。但是,我建议创建该变量和数组,其中数组中的第一个字符串或数字将是所需的输入,第二个字符串将是变量名称。

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] */

如果变量已经是数组,只需将名称添加到数组的最后一个位置即可。

答案 7 :(得分:0)

惊讶地发现还没有超级简单的解决方案。

let varname = "banana"
console.log(`${JSON.stringify({varname}).split('"')[1]}`)

在控制台中打印varname