草庐IT

javascript - 为什么 jQuery 的 $.type() 定义为返回 "object"而不是 "error"用于原生 ECMAScript 错误对象?

coder 2024-05-10 原文

更新:我创建了一个工单: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 标准的这句话中指定的(在 section 8.6.2 中):

The value of the [[Class]] internal property of a host object may be any String value except one of "Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", and "String".

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

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

代替“error”“json”“math”“arguments”,这是此处的实际 [[Class]] 值(大写)。

我想明确指出 $.type 可以根据需要返回那些正确的值,因为它使用了 Object.prototype.toString.call() 检索方法,例如返回 [object Error]" 用于 Error 对象。

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

tl;dr

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

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

最佳答案

这是因为 jQuery 的作者要么忘记了那个类型,要么他们根本不关心它。

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

将正确返回[object Error]

因此,如果您愿意使用稍长的比较字符串,我们开始吧:

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

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

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

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


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

关于javascript - 为什么 jQuery 的 $.type() 定义为返回 "object"而不是 "error"用于原生 ECMAScript 错误对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11797707/

有关javascript - 为什么 jQuery 的 $.type() 定义为返回 "object"而不是 "error"用于原生 ECMAScript 错误对象?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  5. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  6. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  7. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  8. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  9. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  10. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

随机推荐