乐趣区

关于SegmentFault:ObjecttoStringcall-vs-ObjectprototypetoStringcall

平时咱们判断某个变量类型的时候,会这样写:

var foo;
Object.prototype.toString.call(foo);
// "[object Undefined]"

某次,我错写成了这样:

var foo;
Object.toString.call(foo);

// VM40:1 Uncaught TypeError: 
// Function.prototype.toString requires that 'this' be a Function
//  at toString (<anonymous>)
//  at toString (<anonymous>:1:765)
//  at <anonymous>:2:17

后果报错了,产生了什么?
提醒我传入的 foo 应该是个 Function,但很显著 foo 是个 undefined。改一下试试看:

var foo = function(){};
Object.toString.call(foo);
// "function(){}"

这让我纳闷了,function(){} 这个后果应该是对一个函数调用 toString 的后果,于是:

var foo = function(){};
foo.toString();
// "function(){}"

果然,那是不是阐明 Object.toStringFunction.toString 可能存在着某种关系,难道他们是一样的:

Object.toString == Function.toString
// true

本来认为 Object.toString == Object.prototype.toString 应该是 true,没想到, 现实跟事实总是差距很大

那么,为什么 Object.toString == Function.toString 后果是 true 呢?

退出移动版