我想创建一个快速函数,它将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)
。
答案 0 :(得分:13)
console.log({foo})
ES6 IdentifierReference
被ObjectLiteral
PropertyDefinition
PropertyDefinitionList
Object
上的Property
接受为:
变量名称设置为key
的{{1}} Object
并且变量值被设置为Property
的{{1}}的 value
。
当 console.log
显示Object
/ ies'Propertiy
和key
的{{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
无法访问函数varlog
! foo
在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