【问题标题】:Javascript: Reference a variable name from the variable itselfJavascript:从变量本身引用变量名
【发布时间】:2011-07-20 16:53:15
【问题描述】:

我想创建一个快速函数,它将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)

【问题讨论】:

  • @najmeddine 我几乎用更好的格式复制了它。嗬!谢谢:)
  • 我可能只是扩展 javascript 以将所有 var 赋值 var foo = "bar"; 转换为 var foo = {foo:"bar"};(主要是在开玩笑。)(主要是)

标签: javascript


【解决方案1】:

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

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

在控制台中打印varname

【讨论】:

    【解决方案2】:

    将几个答案组合成一个小函数

    这对你有用吗?

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

    【讨论】:

      【解决方案3】:

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

      ES6 中,IdentifierReferences 在ObjectLiteralPropertyDefinitionList (see compatibility chart) 上被接受为PropertyDefinitions:

      变量name被设置为ObjectPropertykey
      并且变量 value 被设置为 ObjectPropertyvalue

      正如 console.log 显示 Objects 和他们的 Propertiy/ies' keys 和 values 你可以使用它来查看变量的 name 和 value 通过调用 console.log({foo})

      请注意,当您使用多个初始化单个匿名 object 变量,就像我在第二个 console.log 中所做的那样,而它们出现在 与在 sn-p 的输出中初始化的顺序相同,它们可能 在别处重新排序(按字母顺序)。

      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 InitializerObject.keys()直接访问变量名:

      var name = "value"
      console.log(Object.keys({name})[0])

      【讨论】:

      • 感谢您的回答。然而,当我尝试使用console.log({this})时,这不起作用?
      • this 不是变量名,它是保留关键字:)
      【解决方案4】:

      我喜欢 @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】:

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

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

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

        【讨论】:

          【解决方案6】:

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

          我能想到的最好的选择是将一个对象传递给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});
          }
          

          【讨论】:

          • 这完全可行,思想没有节省时间的好处,只传递一次变量名。类似于只调用varlog("foo",foo);。但是,它确实有效! :)
          【解决方案7】:

          它不起作用的原因是因为变量foo不能被函数varlog访问! foo 在 someRandomFunction 中声明,并且从未传递到 varlog,所以 varlog 不知道变量 foo 是什么!您可以通过将变量foo 传递到函数中(或使用某种闭包在varlog 的范围内制作foo)及其字符串表示来解决此问题,但除此之外,我认为您已经超出了运气。

          希望这会有所帮助。

          【讨论】:

          • 这就是我的假设,只是想知道是否有人对此有一些荒谬的方法。因为调用varlog("foo", foo); 会起作用,但实际上并没有比console.log( 'foo: ' + foo ); 节省太多时间
          • 好吧,再看看周围,我认为您将无法做到这一点。您只是在寻找一些语法糖吗?
          • 只是懒惰。这是varlog(foo);console.log('foo: ' + foo); 的不同之处。
          猜你喜欢
          • 1970-01-01
          • 2017-03-09
          • 1970-01-01
          • 1970-01-01
          • 2015-10-21
          • 1970-01-01
          • 1970-01-01
          • 2022-01-24
          • 2016-02-24
          相关资源
          最近更新 更多