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
是确定对象是什么的一种方法。细节: