13

更新:我创建了一张票:http ://bugs.jquery.com/ticket/12191


jQuery 的$.type()函数返回[[Class]]对象的内部属性(小写)。例如:

$.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 标准的这句话中指定(在第 8.6.2 节中):

宿主对象的 [[Class]] 内部属性的值可以是除“Arguments”、“Array”、“Boolean”、“Date”、“Error”、“Function”、“JSON”之一之外的任何 String 值、“数学”、“数字”、“对象”、“正则表达式”和“字符串”。

$.type返回"object"这些类型的对象:

$.type( new Error ) // "object"
$.type( JSON ) // "object"
$.type( Math ) // "object"
(function () { $.type( arguments ); /* "object" */ }())

而不是"error", "json", "math", and "arguments", 它们是[[Class]]这里的实际值(大写)。

我想澄清一下,$.type如果它愿意,它可以返回那些正确的值,因为它使用Object.prototype.toString.call()检索方法,例如,它返回"[object Error]"对象Error

那么,为什么 jQuery 报告"object"而不是这四个值呢?我可以理解JSONand Math,因为这些不是实例,而是单例对象。我什至可以理解arguments,因为这是一个自动提供的对象,而不是由 JavaScript 程序显式创建的实例(如 中var args = new Arguments;)。购买为什么会出错?我看不出是什么让Error对象变得特别(与其他原生类型相比,如Date,Array等)。

tl;博士

$.type( new Error ) // why does this return "object" instead of "error"?

更新:只是为了澄清一件事:我知道为什么$.type返回实例,"object"因为Error我已经查看了它的源代码,并找到了导致这种行为的代码。我想知道为什么$.type被定义为以这种方式行事。

4

3 回答 3

2

这是因为 jQuery 的作者要么忘记了这种类型,要么不关心它。

自从

Object.prototype.toString.call( new Error );

将正确返回[object Error]

所以,如果你很高兴有一个稍长的比较字符串,我们开始吧:

(function( type ) {
    console.log( type(new Error) );
}( Function.prototype.call.bind( Object.prototype.toString )));

除此之外,还有 jQuery 不关心的其他“类型” likeJSONany DOMElement。例如,在上述方法正确返回时$.type( JSON )也返回。objecttype[object JSON]

另一个示例$.type( document.body )再次返回object我的简单type()方法再次正确返回的位置[object HTMLBodyElement]

长话短说,jQuery 并没有[[Class]]从所有可用类型中抽象出所有值。浏览器兼容可能是有原因的,但对于Error类型,没有。


实际上有无数种类型,仅适用于所有DOM对象。我可以想象 jQuery 作者只想支持native object types,而没有host object types本质上JSON和任何DOMxxxElement等。我不确定Error object它是本机还是主机。

于 2012-08-03T14:35:56.907 回答
1

好的,所以我在这里提交了一张票:http: //bugs.jquery.com/ticket/12191。它已被归类为错误,预计将在 1.8.1 版本中修复。

于 2012-08-03T23:22:38.890 回答
0

我认为Error类型被认为是不可靠的,很多代码throws 东西,不需要由Error构造函数返回:

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]
}

的省略Arguments甚至更容易解释:'use strict';而是限制了您可以对 arguments 对象执行的操作。我认为最好不要过多地推广它的使用,我认为约翰也是如此。(对不起,永远不要正确拼写他的姓氏——不过,我不是这个人的第一个名字)。

数学被许多人认为是一个对象的坏主意,它应该只是一组函数(根据大多数 JS 人)。无论如何,何时有人将 1 Math 实例传递给该$.type方法?您刚刚输入了构造函数!让你重复这件事可能有什么目的?

JSON 是一个对象,旧版本的 IE 不支持它,因此您必须包含一个文件(就像您必须使用 jQuery 一样)才能拥有该JSON对象。它绝不是原生类型,而是从 DC 的脑海中萌芽的编写良好的格式。除了它是一个对象这一事实之外,JS 还能说什么?

于 2012-08-03T15:07:23.513 回答