web-dev-qa-db-ja.com

javascriptのtypeofが常に「オブジェクト」を返すのはなぜですか?

常にobjectを型として返す場合、何に使用されますか?

常にElementsまたはlistsの場合。

20
Tom Brito

JSのtypeofは、常に 'object'を返すとは限りませんが、オブジェクトとは見なされない可能性のあるもの、つまり配列、そして奇妙なことにnullの場合はobjectを返します。

JSに関する限り、配列はオブジェクトであるため、配列の場合、これは正しいです。それらは同じものです。 Arrayは単なる別のクラスであり、Array型のオブジェクトをインスタンス化できますが、それでもオブジェクトとして扱われます。

このページ JSのタイプのリストと、typeofから各タイプに対して取得する応答があります。また、typeof関数をより有用な情報を返すものでオーバーライドするためのJSコードもいくつかあります。役に立たないことが心配な場合は、必要に応じてそのようなものを実装できます。

21
Spudley

常に「オブジェクト」を返すとは限りません。

_alert(typeof "hello");
_

そうは言っても、オブジェクトを調べるための(おそらく)より便利なトリックは、Object.prototype.toString.call()を使用して結果を確認することです。

_var t = Object.prototype.toString.call(itIsAMystery);
_

これにより、_[object Foo]_のような文字列が得られます。「Foo」は コンストラクター(私は思う) 興味深い部分。 「ネイティブ」タイプ(日付や文字列など)の場合、そのコンストラクター名が返されます。

7
Pointy

私の経験では、typeofの主な問題は、配列、オブジェクト、およびnull(すべて「オブジェクト」を返す)を区別することです。

これを行うには、最初にtypeofをチェックしてから、次のようにnullケースまたは「オブジェクトの」コンストラクターをチェックします。

for (o in obj) {
    if (obj.hasOwnProperty(o)) {
        switch (typeof obj[o]) {
            case "object":
                if (obj[o] === null) {
                    //do somethign with null
                } else {
                    if (obj[o].constructor.name === "Array") {
                        //do something with an Array
                    } else {
                        //do something with an Object
                    }
                }
                break;
            case "function":
                //do something with a function
                break;
            default:
                //do something with strings, booleans, numbers
                break;
        }
    }
}
2
AutoSponge

他のものと追加するために、typeofはオブジェクトとプリミティブの両方を返します。 javascriptには、undefined、null、boolean、string、numberの5つのプリミティブ型があります。他のすべてはオブジェクトです。 typeofがFunction以外のオブジェクトタイプに適用されると、単に「object」を返します。関数に適用すると、関数オブジェクトを返します。

したがって、たとえば:

  • typeof true; //プリミティブ型「boolean」を返します
  • typeof 123; //プリミティブ型「number」を返します
  • typeof null //間違いである「オブジェクト」を返しますが、これまでのところ、別のECMAScriptバージョンでは修正がないので、そうすることについて話してください。
  • typeof object //「object」を返します。これは理にかなっています

Pointyの答えをさらに詳しく説明すると、すべてのJavaScriptオブジェクトには、ECMAScript 5の[[Class]]と呼ばれる内部プロパティがあります。オブジェクトの実際の値を表示するには、次を使用して[[Class]]プロパティを参照できます。 Object.prototype.toString。一部の特殊な組み込みオブジェクトがtoStringを上書きしないようにするには、実際のオブジェクトタイプを明らかにするCallの内部メソッドを使用します。

したがって、toStringから汎用オブジェクトを取得する代わりに:

var dateObject = Object.prototype.toString(new Date);
document.write(dateObject);//[object Object]

Callを使用して実際のオブジェクトタイプを取得できます。

var dateObject = Object.prototype.toString.call(new Date);
document.write(dateObject);//[object Date]
1
James Drinkard

Typeof演算子には少し注意する必要があります。 nullの場合は「object」、NaNの場合は「number」、Infinityの場合は「number」、「new Number(1)」の場合は「object」、配列の場合は「object」を返します。

変数(typeof variable!== "undefined")の存在を確認するとき、typeofはnullに割り当てられた変数の "object"を返すため、最初に(variable == null)かどうかを確認する必要があります。

これは少し明白ですが、typeofをチェックするときに関数を呼び出さないように注意する必要があります。これは、関数の戻り値の型が「関数」ではなく報告されるためです。

1
Grant Nyland

すべてのtypeofがオブジェクトを返すわけではありません。

Objects、ArraysおよびRegExobjectのタイプを返します。

関数これはオブジェクト(参照型)ですが、functionの型を返します。それは言語の矛盾です。

もう1つ注意すべき点は、ndefinedundefinedを返し、nullobjectを返します。これはJSのバグです。

NaN(数値ではありません)はnumberの型を返します。

これらすべてを追跡し、これらの奇妙な動作に注意することをお勧めします。

参考までに、ここにすべてのタイプの値があります。

typeof "Tamal" ---> string
typeof 100 ---> number
typeof true ---> boolean
typeof false ---> boolean
typeof undefined ---> undefined
typeof function() {} ---> function
typeof Symbol() ---> symbol
typeof {name: "Tamal"} ---> object
typeof [1, 2, 3] ---> object
typeof /^/ ---> object
typeof NaN ---> number
typeof null ---> object (bug)