ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript の型チェックと内部プロパティ [[Class]]

JavaScript の型チェックと内部プロパティ [[Class]]

黄舟
黄舟オリジナル
2017-02-28 14:53:141288ブラウズ

すべてのオブジェクトには内部プロパティ [[Class]] が含まれています

このプロパティには直接アクセスできませんが、メソッドを通じてアクセスできます
このメソッドは Object.prototype.toString.call(.. .) <code>Object.prototype.toString.call(...)
这也是比较靠谱的检查类型的方法(instanceof、constructor等等不靠谱)

比如说我们检测一个数组

Object.prototype.toString.call([1,2,3]);

控制台打印"[object Array]"これは、型をチェックするより信頼性の高い方法でもあります (instanceof、コンストラクターなどは信頼できません)

たとえば、配列をチェックする場合

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

コンソールは "[object Array]" を出力します
ここでの「Array」は、実際にはネイティブ関数 Array() 内の [[Class]] 属性を呼び出します

型を検出する関数をカプセル化できます

console.log(classOf({&#39;a&#39;:1}));
console.log(classOf([1,2,3]));
console.log(classOf(function a(){}));
console.log(classOf(/a/));
console.log(classOf(123));
console.log(classOf(&#39;abc&#39;));
console.log(classOf(true));
console.log(classOf(Symbol()));
console.log(classOf(undefined));
console.log(classOf(null));

関数は非常に単純で、単に Object The toString を呼び出すだけですプロトタイプのメソッドは、私たちに役立つ情報をインターセプトしますこの関数を試すことができます

function demo(){
    console.log(classOf(arguments));
}
demo();//"Arguments"

コンソール印刷


しかし、オブジェクトだけでなく、基本的な型の値である文字列、数値、ブール値も使用できることがわかりました。

これは、JavaScript が基本型の値のラッパー オブジェクトをラップするためです
それらをオブジェクトに変換し、String()、Number()、および Boolean() には [[Class]] 属性があります

unknown と null は対応していませんがネイティブ関数 Unknown() と Null() ですが、返される内部プロパティはまだあります

この関数を通じて、型を正確に決定できます
パラメータ リストも決定できます

console.log({&#39;a&#39;:1}.toString());
console.log([1,2,3].toString());
console.log(function a(){}.toString());
console.log(/a/.toString());
console.log(123..toString());
// 只写一个点会被当成小数点,所以再写一个点代表方法调用console.log(&#39;abc&#39;.toString());
console.log(true.toString());
console.log(Symbol().toString());
// 基本类型调用方法,会自动封装为对象
// 不能使用undefined.toString()或null.toString()会报错,因为没有对应的封装对象

Object.prototype.toString.call( に戻ります) ...) 型を決定するためになぜこのような面倒な文字列を調べる必要があるのでしょうか? toString() を直接呼び出すと何が起こるかわかります

rrreee




通常のオブジェクトだけが必要なものを返すことがわかります。
これは、通常のオブジェクトが最上位のプロトタイプ オブジェクトの toString メソッドを直接呼び出すためです
そして、配列、関数、およびこれらの基本的なパッケージ化オブジェクトは Object を継承し、同時にいくつかのメソッドをオーバーライドするためです

toString メソッドを探すときは、それ自体が存在する必要がありますプロトタイプチェーン 最初にメソッドが見つかります

そのため、call を使用して最上位のプロトタイプ Object.prototype の d の toString メソッドを呼び出す必要があります

上記は JavaScript の型チェックと内部プロパティ [[Class]] の内容です。内容については、PHP 中国語 Web サイト (www.php.cn) にご注意ください。


🎜🎜
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。