内置JavaScript函数toString的文档在哪里?
我查看了jQuery代码,发现isArray是使用内置函数toString实现的。我在MDC上找不到此函数的文档。这个文件存在吗?这个函数做什么内置JavaScript函数toString的文档在哪里?,javascript,Javascript,我查看了jQuery代码,发现isArray是使用内置函数toString实现的。我在MDC上找不到此函数的文档。这个文件存在吗?这个函数做什么 isArray: function( obj ) { return toString.call(obj) === "[object Array]"; }, 我查看了jQuery代码,发现isArray是使用内置函数toString实现的 它不是一个内置的。见第68行: toString = Object.p
isArray: function( obj ) {
return toString.call(obj) === "[object Array]";
},
我查看了jQuery代码,发现isArray是使用内置函数toString实现的
它不是一个内置的。见第68行:
toString = Object.prototype.toString,
jQuery正在自己的名为toString
的变量下对Object
上的toString
方法进行复制。Object#toString
方法在MDC(以及ECMAScript本身)中有文档记录。然后,jQuery使用call
调用方法的变量副本,并将对象作为this
传入。此迂回调用方法不允许创建重写toString()
的对象,并且可能返回字符串“[object Array]”
(特别是,字符串'[object Array]'
本身将[object Array]
作为其toString()
值,因此如果直接调用obj.toString()
,将被错误地检测为数组。调用object
的toString()
的基本实现可以避免这种情况。)
测试toString()
表示非常难看(对于主机对象,仍然不是100%),但是更直接的obj instanceof Array
不适用于跨窗口脚本,因为Array
在每个窗口/帧中都是不同的构造函数
ECMAScript第五版添加了函数Array.isArray(obj)
,以避免这种不愉快。然而,浏览器支持目前很差
我查看了jQuery代码,发现isArray是使用内置函数toString实现的
它不是一个内置的。见第68行:
toString = Object.prototype.toString,
jQuery正在自己的名为toString
的变量下对Object
上的toString
方法进行复制。Object#toString
方法在MDC(以及ECMAScript本身)中有文档记录。然后,jQuery使用call
调用方法的变量副本,并将对象作为this
传入。此迂回调用方法不允许创建重写toString()
的对象,并且可能返回字符串“[object Array]”
(特别是,字符串'[object Array]'
本身将[object Array]
作为其toString()
值,因此如果直接调用obj.toString()
,将被错误地检测为数组。调用object
的toString()
的基本实现可以避免这种情况。)
测试toString()
表示非常难看(对于主机对象,仍然不是100%),但是更直接的obj instanceof Array
不适用于跨窗口脚本,因为Array
在每个窗口/帧中都是不同的构造函数
ECMAScript第五版添加了函数
Array.isArray(obj)
,以避免这种不愉快。但是,浏览器支持目前很差。In将内部对象状态转换为其字符串表示形式。In将内部对象状态转换为其字符串表示形式。我明白了。你的解释说明得很清楚。当我说toString是内置的时,我的意思是它是由浏览器本机实现的,因为调用Object.prototype.toString.toSource()告诉您它是本机实现的。剩下的唯一问题是:为什么对象的方法可以从全局范围访问?例如,在Firebug中,以下返回true:toString===Object.prototype.toString这是一个稍微不同的问题:因为在浏览器中,window
被ECMAScript描述为“全局对象”,所以window
的所有成员都可以作为全局变量访问。这就是为什么您可以直接调用例如setTimeout()
以及window.setTimeout()
Window
是一种对象
,因此碰巧对象
的方法也将被公开。但不能保证toString===Object.prototype.toString
;它适合我在Opera、Safari和Chrome中使用,但不是IE或Firefox 3.6。如果在obj
不是窗口
实例时说toString.call(obj)
,可能会出现错误。附带问题:在Firefox中,对我来说,toString==window.toString
。这与神秘而混乱的内外窗世界有关 — . 它不适用于其他窗口
属性。b仔细查看:在调用toString
函数的闭包中,有一个赋值语句:toString=Object.prototype.toString
toString函数具有内置的Object.prototype.toString
的值。作为旁注,这在Blackberry浏览器中引发了一个bug,这里解释道:如果不使用与Object.prototype属性冲突的东西命名标识符,这个问题是可以避免的,例如var\u toString=Object.prototype.toString
@Garrett:是的,这是我在回答中说的第一句话!(是的,令人遗憾的是,令人震惊的黑莓范围漏洞仍未修复。)我明白了。你的解释说明得很清楚。当我说toString是内置的时,我的意思是它是由浏览器本机实现的,因为调用Object.prototype.toString.toSource()告诉您它是本机实现的。剩下的唯一问题是:为什么对象的方法可以从全局范围访问?例如,以下内容在Firebug中返回true:toString==Object.prototype.toString这是一个稍微不同的问题:因为在浏览器窗口中
是ECMAScript描述为