ホームページ  >  記事  >  ウェブフロントエンド  >  オブジェクトの種類を検出するために Object.prototype.toString.call(obj) を使用するのはなぜですか?

オブジェクトの種類を検出するために Object.prototype.toString.call(obj) を使用するのはなぜですか?

青灯夜游
青灯夜游転載
2018-10-10 17:27:452469ブラウズ

私は最近、いくつかの 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());//error
toString メソッドを呼び出す検出オブジェクト obj (toString() メソッドの使用方法については、toString の詳細説明を参照してください)、obj の結果.toString() は

Object と同じです。 prototype.toString.call(obj) の結果は 異なります。なぜですか。これ?

これは、

toString が Object のプロトタイプ メソッドであり、Arrayfunction などの型が Object# # のインスタンスとして書き換えられるためです。 #toString メソッド。さまざまなオブジェクト タイプがプロトタイプ チェーンの知識に基づいて toString メソッドを呼び出すと、対応する書き換えられた toString メソッドが呼び出されます (関数タイプは、内容が関数本体である文字列を返します) , Array 型は、Object のプロトタイプ toString メソッドを呼び出す (オブジェクトの特定の型を返す) のではなく、要素で構成される文字列を返します...)。したがって、obj.toString()そのオブジェクト タイプを取得することはできません。obj を文字列タイプに変換することしかできません。したがって、オブジェクトの特定のタイプを取得したい場合は、Object のプロトタイプ toString メソッドを呼び出す必要があります。

配列の 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 メソッドを呼び出し、

Object.# を返します。 ##prototype

.toString.call(arr)同じ結果。 要約: 以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。関連チュートリアルの詳細については、JavaScript ビデオ チュートリアル

をご覧ください。

関連する推奨事項:

php 公共福祉トレーニング ビデオ チュートリアル

JavaScript グラフィック チュートリアル

#JavaScriptオンラインマニュアル

以上がオブジェクトの種類を検出するために Object.prototype.toString.call(obj) を使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。