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" のいずれかを除く任意の文字列値である可能性があります。 、「数学」、「数値」、「オブジェクト」、「正規表現」、および「文字列」。

$.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"はこれら 4 つの値ではなくレポートを作成するのでしょうか? とはインスタンスではなくシングルトン オブジェクトであるため、JSON理解できました。は、JavaScript プログラムによって明示的に作成されたインスタンス (のように) ではなく、自動的に提供されるオブジェクトであるため、Mathも理解できました。なぜエラーを購入しますか?オブジェクトを特別なものにする理由がわかりません( 、 などの他のネイティブタイプと比較して)。argumentsvar args = new Arguments;ErrorDateArray

tl;dr

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

更新: 1 つのことを明確にするために、ソース コードを調べて、この動作の原因となるコードを見つけたので、インスタンスが$.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 が気にしない、JSONまたはany DOMElementなどの他の「型」があります。たとえば、上記のメソッドは正しく を返しますが、$.type( JSON )も返します。objecttype[object JSON]

別の例では、単純なメソッドが再び正しく返される$.type( document.body )場所を返します。objecttype()[object HTMLBodyElement]

簡単に言えば、jQuery は[[Class]]使用可能なすべての型からすべての値を抽象化するわけではありません。ブラウザ対応には理由があるのか​​もしれませんが、Errorタイプ的にはありません。


実際には、すべてのDOMオブジェクトだけで無数のタイプがあります。jQuery の作成者はサポートしたいだけで、本質的にはどれも、その他も何もサポートnative object typesしていないと想像できます。ネイティブかホストかはわかりません。host object typesJSONDOMxxxElementError 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 に答える