2

Object.prototype.toString.callを使用して変数タイプを識別しています。私は次の動作を期待します:

Object.prototype.toString.call({}) => [object Object]
Object.prototype.toString.call([]) => [object Array]
Object.prototype.toString.call(undefined) => [object Undefined]
Object.prototype.toString.call(null) => [object Null]

これは通常は正常に機能しますが、現在(Internet Explorerで)両方Object.prototype.toString.call(undefined)Object.prototype.toString.call(null)[オブジェクトオブジェクト]を返す状況に直面しており、その理由がわかりません。jsfiddle.netで複製しようとしましたが、複製できなかったため、特定のクァークモードにいると想定しています。

私の質問:

  • これは既知の「動作」ですか。これはいつ発生しますか?
  • オブジェクトタイプをチェックするためのより信頼性の高い方法はありますか(IE7 +をサポートする必要があります)?
4

2 に答える 2

5

ECMAScript5仕様では、§15.2.4.2でObject.prototype.toStringメソッドについて次のように述べています。

toStringメソッドが呼び出されると、次の手順が実行されます。

  1. この値がundefined、の場合は、を返し"[object Undefined]"ます。
  2. この値がnull、の場合は、を返し"[object Null]"ます。
  3. この値を引数として渡してToObjectを呼び出した結果をOとします。
  4. classをOの[[Class]]内部プロパティの値とします。
  5. "[object "3つの文字列、クラス、およびを連結した結果である文字列値を返します"]"

あなたが直面している問題は、IE7と8が古いECMAScript3標準に準拠していることです。これは、同じセクションで次のように述べています。

toStringメソッドが呼び出されると、次の手順が実行されます。

  1. このオブジェクトの[[Class]]プロパティを取得します。
  2. 3つの文字列"[object "、Result(1)、およびを連結して文字列値を計算します"]"
  3. Result(2)を返します。

つまり、古いバージョンのIEでは、メソッドは、または[object Undefined]という[object Null]名前の関数から構築されていない限り、戻りません。UndefinedNull

次の方法を使用して、タイプをより確実にチェックできます。

typeof x === "object"    // x is any sort of object
typeof x === "undefined" // x is undefined
x instanceof Array       // x is an array
x === null               // x is null
于 2013-01-14T20:12:37.747 に答える
0

他の人が言っているように、nullはタイプであり、空のオブジェクト参照Objectを表します。

値のタイプをチェックするより信頼できる方法はtypeof演算子です。

私の知る限り、IE 6以降でサポートされています(またはそれ以前はチェックしていません)。

于 2013-01-14T20:09:12.763 に答える