ホームページ >ウェブフロントエンド >jsチュートリアル >jsの各種データの型を判定するtypeofとobject.prototype.toStringの解説_基礎知識

jsの各種データの型を判定するtypeofとobject.prototype.toStringの解説_基礎知識

WBOY
WBOYオリジナル
2016-05-16 17:17:051001ブラウズ

1. typeof(param) はパラメータ (文字列) の型を返します

このメソッドは JS で定義されたグローバル メソッドであり、コンパイラによって最も一般的に使用されるメソッドでもあります。利点は、使用が簡単で覚えやすいことです。欠点は、オブジェクト、null、配列を判断できないことです。正規表現とカスタムオブジェクトは非常にうまく機能します。

サンプルコード:

コードをコピー コードは次のとおりです:

var str= 'str' ;
var arr=['1','2'];
var num=1;
var bool=true;
var obj={name:'test'};
var nullObj=null;
var unfineedObj=unknown;
var reg=/reg/;

function fn(){
alert('これは関数です');
}

function User(name){
this.name=name;
}
var user=new User('user');

console.log(typeof(str));
console.log(typeof(arr));
console.log(typeof(num));
console.log(typeof(bool) );
console.log(typeof(obj));
console.log(typeof(nullObj));
console.log(typeof(unknownObj));
console.log(typeof( reg));
console.log(typeof(fn));
console.log(typeof(user));


結果は次のようになります:
コードをコピー コードは次のとおりです:

string
object
number
boolean
オブジェクト
オブジェクト
未定義
オブジェクト
関数
オブジェクト

2. Object.prototype.toString().call(param)パラメータのタイプを返します (文字列、形式は [オブジェクト クラス])

このメソッドはほとんどのタイプの判定をサポートでき、jquery のカプセル化された型判定はこのメソッドを使用します。少し混乱している人もいるかもしれないので、簡単に説明します。

1) call(param) 関数

a.fun().call(b) は、js では、オブジェクト b で a を置き換え、次に a の fun 関数を実行することを意味します。

コードをコピー コードは次のとおりです。

function Class1()
{
this.name = "class1" ;

this.showNam = function()
{
アラート(this.name)
}
}

関数 Class2()
{
this.name = "クラス 2"
}

var c1 = 新しいクラス 1();
var c2 = 新しいクラス 2();

c1.showNam.call(c2);


出力は class1 ではなく class2 であり、これはメソッドの継承と同等です。
つまり、Object.prototype.toString().call(param) は実際には param.prototype.toString() を意味するので、param.prototype.toString() を直接記述せず、call() を使用してみましょう。回り道になりますので、以下の2を参照してご理解ください。

2) Object.prototype.toString()

オブジェクトとは何ですか? 、Script56.chm (公式 M$ チュートリアル) には次のように書かれています: Object はすべての JScript オブジェクトに共通の機能を提供します。実際、Object はすべての js オブジェクトの祖先であり、js のすべてのオブジェクトは Object のインスタンスです。さまざまなオブジェクト 独自の独立したメソッドをオーバーライドします。プロトタイプに関しては、あまり深くする必要はありません。プロトタイプへの参照を返すだけで、プロトタイプにメソッドと属性を動的に追加できます

小さな例

コードをコピーします コードは次のとおりです:
function class(){
this.name = "class";
this.showName = function( ){
alert(this.name);
}
}
var obj = new class();
obj.showName();
class .prototype.showNameContact = function (){
alert("プロトタイプ テスト" this.name);
}
obj.showNameContact();


その後、クラスとプロトタイプのテストクラスがそれぞれ出力されます。本来、showNameContact 関数はコンストラクター class() に定義されていませんが、prototype を通じてオブジェクトのプロトタイプに関数を動的に追加することができ、当然新しいオブジェクトに含まれます。例。 。したがって、Object.prototype.toString() は、Object の祖先にある toString メソッドを実行することを意味します。

では、toString() は何をするのでしょうか? toString() 関数は、多くの JS マニュアルで次のように定義されています。
toString() メソッドは、論理値を文字列に変換し、結果を返すことができます。構文は booleanObject.toString() です。先ほども述べたように、js 内のオブジェクトはすべて継承されたオブジェクトであり、これらのオブジェクトにはカスタマイズされた関数が含まれたり、Object の一部の関数が再構築されたりして、すべて toString() 関数が書き換えられます。したがって、1 に param.prototype.toString() を直接記述して、param 自体によって書き換えられた toString() 関数が実行されることは考えられません。

さて、ここからが重要な瞬間です。toString() は何をするのか、またその役割は何でしょうか?

ES3 では、Object.prototype.toString メソッドの仕様は次のとおりです:

Object.prototype.toString()

toString メソッドが呼び出されると、次の手順が実行されます:

1. このオブジェクトの [[Class]] 属性の値を取得します。

2. 3 つの文字列「[object」、最初のステップの演算結果 Result(1)、および「]」連結後の新しい文字列を計算します。

3. 2 番目のステップ Result(2) の演算結果を返します。

ES3 では、[[クラス]] の内部プロパティが何種類あるかは仕様書にまとめられていませんが、[ の値は合計 10 種類あります。 [クラス]] それぞれ、ネイティブ オブジェクトの内部プロパティ: "Array"、"Boolean"、"Date"、"Error"、"Function"、"Math"、"Number"、"Object"、"RegExp"、 「文字列」ですので、 Object.prototype.toString() 出力結果は、[オブジェクト配列]、[オブジェクトブール] 形式の文字列になります。

ES5.1 では、仕様がより詳細に記述されることに加えて、Object.prototype.toString メソッドとオブジェクトの [[class]] 内部プロパティの定義にもいくつかの変更があります。 prototype.toString メソッドは次のとおりです:

Object.prototype.toString ()
toString メソッドが呼び出されると、次の手順が実行されます:

1 this の値が未定義の場合、「[object Unknown]」を返します。
2 this の値が null の場合、「[object Null]」を返します。
3 O をToObject(this) を呼び出した結果。
4 class を O の内部プロパティ [[Class]] の値にする。
5 連結後に 3 つの文字列 "[object "、class、および "]" を返す New文字列。

ステップ 1 と 2 は ES3 よりも 1、2、3 ステップ増えていることがわかります。ステップ 1 とステップ 2 は、「未定義」と「Null」が ES3 の値に属さないため、非常に特殊です。 [[クラス]] 属性。統計によると、返されるタイプは「引数」、「配列」、「ブール値」、「日付」、「エラー」、「関数」、「JSON」、「数学」、「数値」、「オブジェクト」です。 , "RegExp" ", "String" は ES3 よりも 2 つの型が増えています。引数オブジェクトの [[class]] は、以前の "Object" ではなく "Arguments" になりました。また、複数のグローバル オブジェクト JSON があり、その [ [クラス ]]値は「JSON」です。

最後に、Object.prototype.toString().call(param) によって返される [オブジェクト クラス] のクラスの最初の文字は大文字であり、JSON ですら大文字であることを皆さんに思い出していただきたいと思います。判断 エラーを防ぐためにすべてを小文字に変換します。Object.prototype.toString().call(param).toLowerCase() を使用するだけです。

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