Javascript 是否获得比“[object]”更有用的调试值?

Javascript 是否获得比“[object]”更有用的调试值?,javascript,debugging,object-to-string,Javascript,Debugging,Object To String,JavaScript中不能有一个环境标志,这样就可以为对象打开一些元数据 因此,当您调试并获取以下信息时: [object Object] 您将获得变量名和类型: [foo String] 为什么不可能呢?JSON.stringify可能就是您想要的,尽管它不会给您变量的名称——没有第三方工具,JavaScript根本无法做到这一点 您的对象的构造函数可以通过使用它的构造函数属性来访问,尽管这并不能保证构造函数属性是可写的 您可能还想查看该语句。有点粗糙,但它可以帮助您找到对象源: func

JavaScript中不能有一个环境标志,这样就可以为对象打开一些元数据

因此,当您调试并获取以下信息时:

[object Object]
您将获得变量名和类型:

[foo String]
为什么不可能呢?

JSON.stringify可能就是您想要的,尽管它不会给您变量的名称——没有第三方工具,JavaScript根本无法做到这一点

您的对象的构造函数可以通过使用它的构造函数属性来访问,尽管这并不能保证构造函数属性是可写的


您可能还想查看该语句。

有点粗糙,但它可以帮助您找到对象源:

function Foo()
{}

var toClass = function(a)
{
    var _name = a.constructor.toString().match(/^function (\w+)/i); //\w probably should be enhanced
    console.log(_name[1])
}

toClass( new Foo()) //Foo
toClass( [1, 2]) //Array
toClass( new Date()) //Date
toClass( {"a":2}) //Object

旁注:不要为了调试而重写toString。toString有它的目的。并且应该按照预期的方式使用。

要直接回答您关于只翻转全局标志而不是更改调试方法的问题,请执行以下操作:

假设您只在调试期间执行此操作,您可以临时重写Object.prototype.toString以返回对象的JSON表示形式:

Object.prototype.toString = function () { return JSON.stringify(this); };
然后在浏览器控制台中:

var obj = { a: 42 };
console.log('My object: ' + obj);
将为您提供:

My object: {"a":42}
即使这回答了您的问题,我也不建议对基本方法进行全局重写,因为它有可能导致灾难性的问题。尝试依赖单元测试和断点+调试,正如其他人在评论中所建议的那样。

您如何调试?我认为这是关键问题。Javascript不是强类型的,也可以是有争议的类型。例如,当您使用console.log时,您可以定义一个自己的函数来显示x的类型。因此,请尝试编写变量的console.logtypeof。toString表示形式将类似于此,但console.log的结果将更加详细。FF有Object.prototype.toSource,这也是很好的。您使用的调试器是什么?console.log将因平台而异;在某些情况下,它仍然会[旋转]。console.dir更具可移植性,或者至少在支持它的地方是一致的。不过,最好的调试方法是使用附加的调试器。。和单元测试。。不是将这样的调试代码嵌入到程序本身中。对,但是有一种方法可以启动JavaScript运行时,并设置一个标志来打开该元数据。基本上,它会降低执行速度,但会给您调试元数据。据我所知,在任何JavaScript标准中都没有类似的内容,而且没有一个大型浏览器实现这样的功能。我已经用另一个可能的建议编辑了我的答案。@AlexMills当然,如果你的目标平台不是浏览器,那么它可能是一个不同的故事。@Yes,我在回答中明确指出了这一点。我希望你充分阅读我的答案。它的目的是教育。我不喜欢仅仅因为一个方法是不好的实践而隐瞒它的信息。那么为什么一开始就发布这个呢?不管你怎么看,这都是一个非常糟糕的想法,我不认为一个显示出固有的坏代码的答案是如何教育的。你真的相信教育只是为了显示好的东西吗?我不相信,但在我看来,你的答案并没有清楚地将代码作为一个如何不做某事的例子。这可能是一个标题为“避免什么”的有用信息。