2016-01-10 2 views
6

オブジェクトが配列ではないかどうかを調べるコードを調べていますが、this answerが見つかりました。オブジェクトプロトタイプのcall()が配列の型をフェッチしています

コードが正常に動作しているが、私はそれが私がtypeof Arrayを取得しようとしましたが、それはエラーを投げ[object Array]

との比較を行っているかを理解することはできませんよ。だから、私は、オブジェクト上のtoString.call(_ON_AN_ARRAY_)メソッドの呼び出しが正しくArrayオブジェクトの種類を取得する方法を知って興味を持っています。

+2

あなたがリンクしているQAには、Crowderの**完全な**説明へのリンクがあります:http://blog.niftysnippets.org/2010/09/say-what.htmlだから、何が欠けているのかは分かりません君は。 –

+2

BTW [Array.isArray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray#Browser_compatibility)のおかげで、これは現在アレイでは廃止されています。 –

+0

@ DenysSeguret私は非常に興味深い簡単なリンクを行っていません..... –

答えて

3

技術的には、配列はオブジェクトであるので、このコード」

if(Object.prototype.toString.call(someVar) === '[object Array]') { 

で混乱していますあなたがtypeof arrayVarを行うときは、objectを得るが、それはオブジェクトのクラスになどの特定ではありません。

あなたがオブジェクトprototype.toString()を見たときしかし、それはまた、「オブジェクト」を返しますが、あなたは、オブジェクトのプロトタイプを見たとき、およびパスオブジェクト内では、オブジェクトとオブジェクトのクラスを返します。

あなたはそれがObject.prototype.toStringメソッドについて言うこと ECMAScript5 spec (§15.2.4.2)で見ることができます

toStringメソッドが呼び出されると、次のステップが取られています。

  1. この場合値が未定義の場合は、 "[未定義のオブジェクト]"を返します。
  2. この値がnullの場合、 "[object Null]"を返します。
  3. この値を引数として渡すToObjectを呼び出した結果をOとします。
  4. classをOの[[Class]]内部プロパティの値にします。
  5. 3つのString "[object"、class、 "]"を連結した結果のString値を返します。

最後の1つは「方法」に対する答えです。

+0

説明をありがとう! –

関連する問題