Javascript 为什么jQuery';s$.type()定义为返回;“对象”;而不是",;“错误”;对于本机ECMAScript错误对象?
更新:我已经创建了一张票证:Javascript 为什么jQuery';s$.type()定义为返回;“对象”;而不是",;“错误”;对于本机ECMAScript错误对象?,javascript,jquery,Javascript,Jquery,更新:我已经创建了一张票证: jQuery函数返回对象的内部属性(小写)。例如: $.type( {} ) // "object" $.type( [] ) // "array" $.type( function () {} ) // "function" 但是,它仅适用于以下类型的对象: Boolean Number String Function Array Date RegExp Object 由jQuery源代码的这一部分指定: // Populate the class2type
jQuery函数返回对象的内部属性(小写)。例如:
$.type( {} ) // "object"
$.type( [] ) // "array"
$.type( function () {} ) // "function"
但是,它仅适用于以下类型的对象:
Boolean Number String Function Array Date RegExp Object
由jQuery源代码的这一部分指定:
// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
除了这些类型的对象外,ECMAScript标准还为以下对象定义了相应的[[Class]]
内部属性:
Arguments Error JSON Math
这在ECMAScript标准(中)的这句话中有规定:
宿主对象的[[Class]]内部属性的值可能是
除“参数”、“数组”、“布尔值”之外的任何字符串值,
“日期”、“错误”、“函数”、“JSON”、“数学”、“数字”、“对象”,
“RegExp”和“String”
$.type
为这些类型的对象返回“对象”
:
$.type( new Error ) // "object"
$.type( JSON ) // "object"
$.type( Math ) // "object"
(function () { $.type( arguments ); /* "object" */ }())
而不是“error”
、“json”
、“math”
和“arguments”
,它们是此处的实际值(大写)
我想明确指出的是,$.type
可以根据需要返回那些正确的值,因为它使用了对象.prototype.toString.call()
检索方法,例如,它为错误
对象返回“[Object Error]”
那么,为什么jQuery报告的是“object”
,而不是这四个值呢?我可以理解JSON
和Math
,因为它们不是实例,而是单例对象。我甚至可以理解参数
,因为这是一个自动提供的对象,而不是由JavaScript程序显式创建的实例(如var args=new arguments;
)。为什么要买错误?我看不出是什么使Error
对象特别(与其他本机类型相比,如Date
,Array
等)
tl;dr
更新:只是为了澄清一件事:我知道为什么
$。type
返回错误实例的“object”
,因为我查看了它的源代码,找到了导致这种行为的代码。我想知道为什么$。type
被定义为这样的行为。这是因为jQuery的作者要么忘记了该类型,要么不关心它
自
将正确返回[对象错误]
因此,如果您对比较字符串稍微长一点感到很酷,那么我们来:
(function( type ) {
console.log( type(new Error) );
}( Function.prototype.call.bind( Object.prototype.toString )));
除此之外,jQuery还不关心其他“类型”,如JSON
或anyDOMElement
。例如,$.type(JSON)
还返回object
,而上述type
方法正确返回[objectjson]
另一个示例$.type(document.body)
再次返回对象
,其中我的简单type()
方法再次正确返回[object HTMLBodyElement]
长话短说,jQuery不会从所有可用类型中提取所有[[Class]]
值。being浏览器兼容可能是有原因的,但对于错误
类型,则没有原因
实际上,只有所有DOM
对象才有无数类型。我可以想象,jQuery作者只想支持本机对象类型
和不支持主机对象类型
,它们本质上是JSON
和任何DOMxxxElement
等。我不确定错误对象是本机对象还是主机对象。我认为错误类型被认为是不可靠的,很多代码抛出了东西,而错误构造函数不需要返回这些东西:
function foo()
{
throw 'I\'m what a lot of people call an error';
}
try
{
foo();
}
catch(e)
{
console.log(Object.prototype.toString.call(e));//[object String]
}
省略参数
更容易解释:使用strict代码>限制了可以对arguments对象执行的操作。我认为最好不要过度推广它的使用,我认为约翰也是。(对不起,千万别把他的姓拼对了——不过,我和那个男人不是一个名字)
对于一个对象来说,数学被很多人认为是一个坏主意,它应该只是一组函数(根据大多数JS人员的说法)。无论如何,什么时候会有人将1个数学实例传递给$.type
方法?您刚刚键入了构造函数!把这件事告诉你有什么用呢
JSON是一个对象,旧版本的IE不支持它,因此您必须包含一个文件(就像您必须使用jQuery)才能拥有JSON
对象。它并不是一种本地类型,而是从DC的头脑中萌生出来的一种编写良好的格式。除了它是一个对象这一事实之外,JS还能对它说些什么呢?好的,所以我在这里提交了一张票证:。它已被归类为一个bug,预计将在1.8.1版中修复。这个问题可能更适合于开发jQuery核心论坛。刚刚测试,Object.prototype.toString.call(新类型错误)代码>返回IE6+、Opera 9+、Chrome 1+、FF 14、Safari 3.2+(以前的版本未测试)的[对象错误]
。这个值是可靠的,所以我认为没有理由排除它。@KevinB重要的是这个问题是否适合这个论坛,我认为是的。我更喜欢堆栈溢出,而不是其他任何论坛。我会冒险猜测,这仅仅是为了在人们不会使用的功能上节省字节。jQuery中1字节的差异可能会转化为每天兆字节或千兆字节的数据传输。这里的每个人都在假设他们为什么这样做。询问jQuery核心开发人员列表!问问写它的人,而不是使用它的人。我发现这很难相信。他们明确决定从返回值集中排除“error”
,这一定是有原因的。@ŠimeVidas:无论如何,这是事实。除非
(function( type ) {
console.log( type(new Error) );
}( Function.prototype.call.bind( Object.prototype.toString )));
function foo()
{
throw 'I\'m what a lot of people call an error';
}
try
{
foo();
}
catch(e)
{
console.log(Object.prototype.toString.call(e));//[object String]
}