更新:我创建了一张票: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"
而不是这四个值呢?我可以理解JSON
and 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
被定义为以这种方式行事。