函数是一个对象吗?为什么console.log不显示可检查的对象?

3
var foo = function () {};
foo.a = "an attribute";  // set attribute to prove foo is an object
console.log(foo)  // log shows: function () {};

我以为函数foo是一个对象,但为什么在Chrome的console.log中显示的是"function () {}"而不是可检查的对象?是否有办法在记录函数时显示可检查的对象?
3个回答

7
当您调用console.log(foo)时,控制台会构建一个非规范化的显示(它不是EcmaScript的一部分)。在大多数情况下(但对于基本对象不是这样),它调用参数的toString函数(但会执行更多工作,例如为字符串添加引号、设置颜色、提供对象浏览等)。
函数的toString函数只是打印代码。
如果您想查看所有属性,可以这样做。
console.dir(foo);

或者(至少在Chrome上
console.log("%O", foo);

如果其他对象有专门的 toString 函数,您也会看到相同的现象。

例如:

var a = new Number(3);
a.b = 4;
console.log(a); // logs just 3
console.dir(a); // lets you see b

我认为它并没有调用 toString 方法。控制台只是根据自己的格式化规则来显示值。毕竟,console.log({}) 在 Chrome 中并不会显示 [object Object] - Felix Kling
实际上这取决于情况......我正在看它。 我还测试了Object.prototype.toString.apply(foo) - Denys Séguret
哇,谢谢console.log("%O", foo);,从来不知道有%O。 - Helin Wang
好的,我的意思是它不仅仅调用 toString ;) 例如,对于数组,Chrome 还显示 undefined x 2 简写。 - Felix Kling
@FelixKling 我并不是在说你错了。我只是尝试了很多情况,并试图找到一个通用的表述。 - Denys Séguret
我只知道console.dir,一直以来都使用console.log,认为其中有些魔法。从现在开始,每当需要检查对象时,我应该使用console.dir。因为在某些代码情况下,使用console.log不能像以前那样显示所有属性。 - haxpor

1
使用 console.dir() 来查看 a
>>>>console.log(foo);
function()
>>>>console.dir(foo);
a            "an attribute"
prototype    Object { }

0
dystroy 是正确的。function 是一个对象,它的 toString 方法会打印出代码。
console.log(foo.a); 

会奏效的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接