すべてのオブジェクトには内部プロパティ [[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({'a':1})); console.log(classOf([1,2,3])); console.log(classOf(function a(){})); console.log(classOf(/a/)); console.log(classOf(123)); console.log(classOf('abc')); console.log(classOf(true)); console.log(classOf(Symbol())); console.log(classOf(undefined)); console.log(classOf(null));
function demo(){ console.log(classOf(arguments)); } demo();//"Arguments"
コンソール印刷
これは、JavaScript が基本型の値のラッパー オブジェクトをラップするためです
それらをオブジェクトに変換し、String()、Number()、および Boolean() には [[Class]] 属性があります
この関数を通じて、型を正確に決定できます
パラメータ リストも決定できます
console.log({'a':1}.toString()); console.log([1,2,3].toString()); console.log(function a(){}.toString()); console.log(/a/.toString()); console.log(123..toString()); // 只写一个点会被当成小数点,所以再写一个点代表方法调用console.log('abc'.toString()); console.log(true.toString()); console.log(Symbol().toString()); // 基本类型调用方法,会自动封装为对象 // 不能使用undefined.toString()或null.toString()会报错,因为没有对应的封装对象
Object.prototype.toString.call( に戻ります) ...) 型を決定するためになぜこのような面倒な文字列を調べる必要があるのでしょうか? toString() を直接呼び出すと何が起こるかわかります
rrreee
通常のオブジェクトだけが必要なものを返すことがわかります。
これは、通常のオブジェクトが最上位のプロトタイプ オブジェクトの toString メソッドを直接呼び出すためです
そして、配列、関数、およびこれらの基本的なパッケージ化オブジェクトは Object を継承し、同時にいくつかのメソッドをオーバーライドするためです
そのため、call を使用して最上位のプロトタイプ Object.prototype の d の toString メソッドを呼び出す必要があります