ホームページ >ウェブフロントエンド >jsチュートリアル >オブジェクトの種類を検出するために Object.prototype.toString.call(obj) を使用するのはなぜですか?
私は最近、いくつかの JS インタビューを行いました。JavaScript インタビューで重要な 25 の質問*、その最初の質問は次のとおりです。 typeof bar === "object"
を使用して、「bar」がオブジェクトかどうかを検出し、何の欠点ですか?それを避けるにはどうすればよいでしょうか?
これは非常に一般的な質問です。###typeof を使用してオブジェクト変数を正確に決定できますか?
null の結果も同様です。
Array の結果もオブジェクトである場合があります。場合によっては、「純粋な」オブジェクトが必要になります。それを避けるにはどうすればよいでしょうか?より良い方法は次のとおりです:
console.log(Object.prototype.toString.call(obj) === "[object Object]");上記の方法を使用して、さまざまなタイプを区別します: (カスタム オブジェクト タイプは区別できません。カスタム タイプは、instanceof によって区別できます)
console.log(Object.prototype.toString.call("jerry"));//[object String] console.log(Object.prototype.toString.call(12));//[object Number] console.log(Object.prototype.toString.call(true));//[object Boolean] console.log(Object.prototype.toString.call(undefined));//[object Undefined] console.log(Object.prototype.toString.call(null));//[object Null] console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object] console.log(Object.prototype.toString.call(function(){}));//[object Function] console.log(Object.prototype.toString.call([]));//[object Array] console.log(Object.prototype.toString.call(new Date));//[object Date] console.log(Object.prototype.toString.call(/\d/));//[object RegExp] function Person(){}; console.log(Object.prototype.toString.call(new Person));//[object Object]なぜこのように区別できるのでしょうか?そこで、toString メソッドの使用法を調べてみました。toString メソッドは、このオブジェクトを反映する文字列を返します。
では、obj.toString() を直接使用しないのはなぜでしょうか?
console.log("jerry".toString());//jerry console.log((1).toString());//1 console.log([1,2].toString());//1,2 console.log(new Date().toString());//Wed Dec 21 2016 20:35:48 GMT+0800 (中国标准时间) console.log(function(){}.toString());//function (){} console.log(null.toString());//error console.log(undefined.toString());//errortoString メソッドを呼び出す検出オブジェクト obj (toString() メソッドの使用方法については、toString の詳細説明を参照してください)、obj の結果.toString() は
Object と同じです。 prototype.toString.call(obj) の結果は 異なります。なぜですか。これ?
これは、toString が Object のプロトタイプ メソッドであり、Array、
function などの型が Object# # のインスタンスとして書き換えられるためです。 #toString メソッド。さまざまなオブジェクト タイプがプロトタイプ チェーンの知識に基づいて toString メソッドを呼び出すと、対応する書き換えられた toString メソッドが呼び出されます (関数タイプは、内容が関数本体である文字列を返します) , Array 型は、Object のプロトタイプ toString メソッドを呼び出す (オブジェクトの特定の型を返す) のではなく、要素で構成される文字列を返します...)。したがって、obj.toString()そのオブジェクト タイプを取得することはできません。obj を文字列タイプに変換することしかできません。したがって、オブジェクトの特定のタイプを取得したい場合は、Object のプロトタイプ toString メソッドを呼び出す必要があります。
var arr=[1,2,3];console.log(Array.prototype.hasOwnProperty("toString"));//true
console.log(arr.toString());//1,2,3
delete Array.prototype.toString;//delete操作符可以删除实例属性
console.log(Array.prototype.hasOwnProperty("toString"));//false
console.log(arr.toString());//"[object Array]"
配列の toString メソッドを削除した後、同じ arr.toString() メソッドが再度使用されると、オブジェクトのプロトタイプ メソッドを保護するインスタンス メソッドが存在しないため、プロトタイプ チェーンに沿って、arr は最終的にオブジェクトの toString メソッドを呼び出し、
.toString.call(arr)同じ結果。 要約: 以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。関連チュートリアルの詳細については、JavaScript ビデオ チュートリアル
をご覧ください。php 公共福祉トレーニング ビデオ チュートリアル
以上がオブジェクトの種類を検出するために Object.prototype.toString.call(obj) を使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。