1

JavaScript には 5 つのプリミティブ型 (null、undefined、boolean、number、string) があり、次に object (配列、関数、およびカスタム定義の疑似クラス オブジェクトを含む) があると思いました。しかし、それは少し奇妙です

typeof null

であり、 、 などの"object"疑似古典クラスのオブジェクト クラス名を取得する簡単な方法はありません。プリミティブ型 (およびfor 、 not ) の場合は小文字の名前を返し、カスタム定義の疑似古典オブジェクトの大文字の場合を返すことができる新しい演算子または関数があるのだろうか?PersonAuthor"null"null"object"

そのような演算子または関数が ECMA-5 以降に存在しない場合、それを使用する意味はありますか? それ以外の場合は、独自の定義またはフレームワークに依存する必要があるかもしれませんが、それは異なるプラットフォーム間で標準ではありません.

4

3 に答える 3

3

ECMAScript 5オブジェクトには、として知られる内部プロパティがあります[[Class]]。これは、ES5であなたが求めているものに最も近いものです。次のように[[Class]]アクセスできます。Object.prototype.toString

function getClassOf(obj) {
    return Object.prototype.toString.call(obj).slice(8, -1);
}

getClassOf([ ]); // => "Array"
getClassOf(new Date()); // => "Date"
getClassOf(function() { }); // => "Function"
getClassOf(3); // => "Number"
getClassOf(true) // => "Boolean"
getClassOf(document.createElement('div')); // => "HTMLDivElement"
getClassOf(Math); // => "Math"
getClassOf(null); // => "Null"
getClassOf(undefined); // => "Undefined"
getClassOf({ x: 1 }); // => "Object"

この動作は、他のフレームからのオブジェクトを適切に識別するために重要です。

ただし、ユーザー定義のコンストラクターでは機能しません。ユーザー定義のコンストラクターで作成されたオブジェクトには。があり[[Class]] "Object"ます。

function Foo() { }
var foo = new Foo();

getClassOf(foo); // => "Object"

ECMAScript 6には、によって返されるものを拡張する機能があるObject.prototype.toStringようです。そのため、シンボルを介して実行されるgetClassOf(foo)可能性があります。"Foo"@@toStringTag

今後の標準の詳細については、https://mail.mozilla.org/pipermail/es-discuss/2012-September/025344.htmlを参照してください。


あなたはこのようにあなたがしたいことをするためにあなた自身の関数を作ることができます:

function getTypeOf(value) {

    // Return "null" for null.
    if (value === null) return 'null';

    // Return primitive types.
    var type = typeof value;
    if (type != 'object') return type;

    // Return [[Class]] if available for objects.
    type = Object.prototype.toString.call(value).slice(8, -1);
    if (type != 'Object') return type;

    // Return "Object" if it wasn't created with another constructor.
    var proto = Object.getPrototypeOf(value);
    if (proto == Object.prototype)
        return 'Object';

    // Return the constructor name if constructor hasn't been
    // modified on the object.
    if (value.constructor && proto === value.constructor.prototype)
        return value.constructor.name;

    // Return the constructor name if constructor hasn't been
    // modified on the prototype.
    if (proto.constructor && proto === proto.constructor.prototype)
        return proto.constructor.name;

    // Return "???" if the type is indeterminable.
    return '???';

}

例:

getTypeOf([ ]); // => "Array"
getTypeOf(new Date()); // => "Date"
getTypeOf(function() { }); // => "Function"
getTypeOf(3); // => "number"
getTypeOf(true) // => "boolean"
getTypeOf(document.createElement('div')); // => "HTMLDivElement"
getTypeOf(Math); // => "Math"
getTypeOf(null); // => "null"
getTypeOf(undefined); // => "undefined"
getTypeOf({ x: 1 }); // => "Object"

function Foo() { }
var foo = new Foo();

getTypeOf(foo); // => "Foo"

// If the constructor property is changed, still works.
foo.constructor = function FakeConstructor() { };
getTypeOf(foo); // => "Foo"

// If the constructor property AND the prototype's constructor is
// changed, result is "???".
foo.constructor = function FakeConstructor() { };
Foo.prototype.constructor = function FakeConstructor2() { };
getTypeOf(foo); // => "???"
于 2012-11-01T21:23:53.867 に答える
1

のその動作はtypeof、仕様、セクション 11.4.3、表 20 によって決定されます。

表 20 — typeof 演算子の結果

Type of val                      Result
-----------------------------------------------------------------------------------
Undefined                        "undefined"
-----------------------------------------------------------------------------------
Null                             "object"
-----------------------------------------------------------------------------------
Boolean                          "boolean"
-----------------------------------------------------------------------------------
Number                           "number"
-----------------------------------------------------------------------------------
String                           "string"
-----------------------------------------------------------------------------------
Object (native and does not 
implement [[Call]])              "object"
-----------------------------------------------------------------------------------
Object (native or host 
and does implement [[Call]])     "function"
-----------------------------------------------------------------------------------
Object (host and does not        Implementation-defined except may not be 
implement [[Call]])              "undefined", "boolean",  "number", or "string".

(CapitalizedNullは、唯一の値が である内部型ですnull。)

これは単なる慣例のようです。null instanceof Objectであるfalseため、予想どおり、nullは明らかにオブジェクトではありません。

お探しのオペレーターは存在しません。名前を理解するには、 を使用して、およびその他のプリミティブ=== nullをテストできます。「カスタム定義の疑似古典オブジェクト」に関しては、自由に使用できるツールは次のとおりです。nulltypeof

(この質問からリストしてください。いくつかの例を見ることができます。)

于 2012-11-01T03:32:16.510 に答える
0

これは、すべてのブラウザですぐに実行できます。

オブジェクトのconstructorプロパティは、そのオブジェクトのプロトタイプを所有する関数を返します。

function Person() { }
alert(new Person().constructor === Person) //true
于 2012-11-01T02:41:16.943 に答える