JavaScript:toString

JavaScript:toString,javascript,scope,window,tostring,Javascript,Scope,Window,Tostring,为什么Object.prototype.toString===toString?如果我在全球范围内拥有此功能: var toStringValue = toString.call("foobaz"); 我希望toStringValue是window的值。因为window是默认范围,对吗?为什么toString本身会解析为Object.prototype.toString而不是window.toString?您将获得的结果取决于主机环境。如果我运行这个: alert(toString === w

为什么
Object.prototype.toString===toString
?如果我在全球范围内拥有此功能:

var toStringValue = toString.call("foobaz");

我希望
toStringValue
window的值。因为
window
是默认范围,对吗?为什么
toString
本身会解析为
Object.prototype.toString
而不是
window.toString

您将获得的结果取决于主机环境。如果我运行这个:

alert(toString === window.toString);
alert(toString === Object.prototype.toString);​
…在Chrome上,我分别得到
true
false
;在Firefox上,我得到了
false
false
。IE给出
见下文


浏览器上的窗口对象有点棘手,因为它是一个主机对象,如果主机对象愿意,它们可以做一些奇怪的事情。:-)例如,您的
toString.call(“foobaz”)
将在IE上失败,因为
窗口的
toString
不是一个真正的JavaScript函数,并且没有
call
apply
。(我并不是说这样做是对的,你知道……

这就是为什么框架倾向于在本地缓存
对象.prototype.toString
?@Jeremy:不,他们这样做只是为了省去一直查找它(
对象.prototype.toString
是两个属性查找,可能是一系列范围遍历/查找);将值捕获到本地文件可以更快、更简洁)。他们需要一个方便的引用,因为
Object.prototype.toString
是确定对象是什么的一种方法。细节: