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
any
DOMElement
。例如,
$.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]
}