当我console.log()
在 JavaScript 程序中创建一个对象时,我只看到输出[object Object]
,这对于确定它是什么对象(甚至是什么类型的对象)并不是很有帮助。
在 C# 中,我习惯于重写ToString()
以便能够自定义对象的调试器表示。我可以在 JavaScript 中做类似的事情吗?
当我console.log()
在 JavaScript 程序中创建一个对象时,我只看到输出[object Object]
,这对于确定它是什么对象(甚至是什么类型的对象)并不是很有帮助。
在 C# 中,我习惯于重写ToString()
以便能够自定义对象的调试器表示。我可以在 JavaScript 中做类似的事情吗?
您也可以toString
在 Javascript 中进行覆盖。见示例:
function Foo() {}
// toString override added to prototype of Foo class
Foo.prototype.toString = function() {
return "[object Foo]";
}
var f = new Foo();
console.log("" + f); // console displays [object Foo]
见这对如何在JavaScript中确定对象类型名称的讨论。
首先覆盖toString
您的对象或原型:
var Foo = function(){};
Foo.prototype.toString = function(){return 'Pity the Foo';};
var foo = new Foo();
然后转换为字符串,查看对象的字符串表示:
//using JS implicit type conversion
console.log('' + foo);
如果您不喜欢额外的输入,您可以创建一个函数,将其参数的字符串表示形式记录到控制台:
var puts = function(){
var strings = Array.prototype.map.call(arguments, function(obj){
return '' + obj;
});
console.log.apply(console, strings);
};
用法:
puts(foo) //logs 'Pity the Foo'
puts(foo, [1,2,3], {a: 2}) //logs 'Pity the Foo 1,2,3 [object Object]'
E2015 为这些东西提供了更好的语法,但你必须使用像Babel这样的转译器:
// override `toString`
class Foo {
toString(){
return 'Pity the Foo';
}
}
const foo = new Foo();
// utility function for printing objects using their `toString` methods
const puts = (...any) => console.log(...any.map(String));
puts(foo); // logs 'Pity the Foo'
如果您使用的是 Node,则可能值得考虑util.inspect
。
var util = require('util')
const Point = {
x: 1,
y: 2,
[util.inspect.custom]: function(depth) { return `{ #Point ${this.x},${this.y} }` }
}
console.log( Point );
这将产生:
{ #Point 1,2 }
而没有检查打印的版本:
{ x: 1, y: 2 }
更多信息(+在class
es 中使用的示例):
在浏览器 JS 中获得可调试输出的一种简单方法是将对象序列化为 JSON。所以你可以像这样打电话
console.log ("Blah: " + JSON.stringify(object));
例如,alert("Blah! " + JSON.stringify({key: "value"}));
生成带有文本的警报Blah! {"key":"value"}
使用模板文字:
class Foo {
toString() {
return 'I am foo';
}
}
const foo = new Foo();
console.log(`${foo}`); // 'I am foo'