JavaScriptでは、このようなコードがよく表示されます。変数とnull(この使用法は非常に問題があります)と、変数に合理的な値が与えられるかどうかを判断するために使用されます。例えば:
var controller = {process:function(items){if(items!== null){// bad writing method items.sort(); items.foreach(function(item){// execute rogic});}}}}このコードでは、プロセス()メソッドは、アイテムがsort()とforeach()を持っていることがわかるため、明らかにアイテムが配列であることを期待しています。このコードの意図は非常に明白です。パラメーター項目がグループ番号ではない場合、次の操作は停止します。この執筆方法の問題は、nullとの比較が実際にエラーを防ぐことができないということです。アイテムの値は、1、文字列、または任意のオブジェクトでもあります。これらの値はnullに等しくなく、Process()メソッドがsort()に実行されるとエラーが発生します。
Nullのみと比較すると、後続のコード実行が本当に安全であるかどうかを判断するのに十分な情報が提供されません。幸いなことに、JavaScriptは、変数の真の値を検出する多くの方法を提供します。
元の値を検出します
JavaScriptには、文字列、数字、ブール、未定義、nullの5つのプリミティブタイプ(単純なデータ型とも呼ばれます)があります。値を文字列、番号、ブール、または未定義であることを望む場合、最良のオプションは、タイプを表す文字列を返すTypeof演算子を使用することです。
文字列の場合、typeofは「文字列」を返します。
数字の場合、typeofは「番号」を返します。
Booleanの場合、Typeofは「Boolean」を返します。
未定義の場合、typeofは「未定義」を返します。
typeofの基本的な構文は次のとおりです。Typeof変数、Typeof(変数)を使用することもできますが、これはlegal JavaScriptの構文であり、Typeofは演算子ではなく関数のように見えるようにします。これを考慮して、括弧なしで書くことをお勧めします。
TypeOFを使用してこれらの4つの原始タイプを検出することは非常に安全です。次の例を見てみましょう。
// "string" if(typeof name === "string"){anothername = name.substring(3);} // "number" if(typeof count === "number"){updateCount(count);} //検出 "boolean" if(typeof found === "boolean" && found "if") (typeof myApp === "未定義"){myApp = {// other code};}TypeOF演算子は、非宣言されていない変数で使用されたときにエラーを報告しないという点でユニークです。未定義の変数と値が未定義の変数と変数は、両方ともtypeofを介して「未定義」に戻ります。
typeofを介して最後のプリミティブタイプnullは「オブジェクト」を返します。これは奇妙に見え、標準仕様の深刻なバグと見なされるため、プログラミングの場合は、nullタイプを検出するためにtypeofの使用を防ぐ必要があります。
console.log(typeof null); // "物体"
通常、nullと比較すると、値のタイプが合法かどうかを判断するのに十分な情報が含まれていないため、nullは一般に検出ステートメントでは使用されません。
ただし、例外があります。期待値が本当にnullの場合、nullと直接比較できます。例えば:
// nullを検出する必要がある場合は、この方法を使用しますvar element = document.getElementById( "my-div"); if(element!== null){element.className = "fund";}DOM要素が存在しない場合、document.getElementByID()によって取得された値はnullです。この方法は、ノードを返すか、nullを返します。 NULLは現時点では予見可能な出力であるため、ID operator ===または非同一性演算子!==を使用して、返品結果を検出できます。
上記の文字列、数字、ブール、未定義、およびオブジェクトに加えて、typeof演算子の返品値も機能します。技術的な観点からは、関数はデータ型ではなくJavaScriptのオブジェクトでもあります。ただし、関数にはいくつかの特別な特性があるため、TYPEOF演算子によって関数を他のオブジェクトと区別する必要があります。この機能は、後で検出機能で使用されます。
参照値を検出します
JavaScriptでは、元の値を除き、すべての参照値(オブジェクトとも呼ばれます)。一般的に使用される参照タイプは、オブジェクト、配列、日付、およびregexpです。これらの参照タイプは、JavaScriptに組み込まれたオブジェクトです。 TypeOF演算子は、これらの参照タイプを判断するときに「オブジェクト」を返します。
console.log(typeof {}); // "object" console.log(typeof []); // "object" console.log(typeof new date()); // "object" console.log(typeof new regexp()); // "object" console.log(typeof new regexp()); // "物体"参照される値タイプを検出する最良の方法は、オペレーターのインスタンスを使用することです。 InstanceOFの基本的な構文は次のとおりです。
value instanceof constructor //日付を検出するif(value instance of date){console.log(value.get.fullyear);} // errorif(value value value;} //正規表現を検出するif(value.test(anothervalue)))InstanceOFの興味深い機能は、このオブジェクトを構築するコンストラクターを検出するだけでなく、プロトタイプチェーンも検出することです。プロトタイプチェーンには、オブジェクトの定義に使用される継承パターンを含む多くの情報が含まれています。たとえば、デフォルトでは、各オブジェクトはオブジェクトから継承されるため、各オブジェクトのオブジェクトの値インスタンスがtureを返します。例えば:
var now = new date(); console.log(現在はオブジェクトのinstance); // natureconsole.log(今すぐインスタンスの日付); // natureinStanceof演算子は、function person(name){this.name = name;} var me = new person( "nicholas"); console.log(me instanceof object);などのカスタムタイプを検出することもできます。 // natureconsole.log(me instanceof person); //自然人タイプは、このサンプルコードで作成されます。可変私は人のインスタンスであるため、人のインスタンスは真実です。上記のように、すべてのオブジェクトはオブジェクトのインスタンスと見なされるため、Me Instanceofオブジェクトも課題です。
JavaScriptの組み込みとカスタムタイプを検出するとき、これを行う最良の方法は、それを行う唯一の方法です。
しかし、深刻な制限があります。両方のブラウザフレーム(フレーム)がコンストラクターの人と、フレームAのframeapersonInstanceがフレームBに渡されると仮定すると、次の結果は次のとおりです。
console.log(frameapersoninstance frameapersonのインスタンス)// ture
console.log(frameapersonInstance framebpersonのインスタンス)// false
2人の定義はまったく同じですが、異なるフレームで異なるタイプと見なされます。この問題を抱える2つの非常に重要な組み込みタイプがあります。配列と機能を備えているため、それらを検出しても、一般的にInstanceOFを使用しません。
検出機能
技術的に言えば、JavaScriptの関数は参照タイプであり、関数コンストラクターもあります。たとえば、各関数は例です。
function myfunc(){} // bad writing method console.log(myfunc instanceof function); // 真実ただし、各フレームには独自の関数コンストラクターがあるため、この方法はフレーム間で使用することはできません。幸いなことに、TYPEOFオペレーターは機能にも使用して、「関数」を返します。
function myfunc(){} //グッドライティングメソッドconsole.log(typeof myfunc === "function"); // 真実関数を検出する最良の方法は、フレーム間で使用できるため、TypeOFを使用することです。
TypeOFを使用して関数を検出することには制限があります。 IE 8以前のIEブラウザーでは、TypeOFが「関数」ではなく「オブジェクト」をすべて返すDOMノードの関数を検出するために使用されます。例えば:
// iEconsole.log(typeof document.createelement); // "object" console.log(typeof document.getElementByID); // "object" console.log(typeof document.getElementByTagname); // "object" console.log(typeof document.getElementByTagname); // "物体"
この奇妙な現象は、ブラウザがDOMの実装に違いがあるために発生します。要するに、これらの以前のバージョンのIEは、組み込みのJavaScriptメソッドとしてDOMを実装していなかったため、これらの関数をオブジェクトとして識別する組み込みのTypeofオペレーターが作成されました。 DOMが明確に定義されているため、オブジェクトメンバーが存在することを知っていることは、それがメソッドであることを意味するため、開発者はしばしばIN演算子を使用して、次のようなDOMメソッドを検出します。
// domメソッドを検出するif( "queryselectorall" in document){var images = document.queryselectorall( "img");}このコードでは、QuerySeLectorallがドキュメントで定義されているかどうかを確認し、もしそうなら、この方法を使用します。理想的な方法ではありませんが、DOMメソッドがIE 8以前のブラウザに存在するかどうかを検出する最も安全な方法です。他のすべての場合において、TypeOF演算子はJavaScript関数を検出するための最良の選択です。
配列を検出します
JavaScriptで最も古いクロスドメインの問題の1つは、フレーム間で配列を前後に渡すことです。開発者はすぐに、このシナリオで正しい結果を返すことができないことを発見しました。上記のように、各フレームには独自の配列コンストラクタがあるため、あるフレームのインスタンスは別のフレームでは認識されません。
JavaScriptのアレイタイプを検出する方法に関する多くの研究があり、最終的にKangaxはエレガントなソリューションを提供しました。
function isArray(value){return object.prototype.tostring.call(value)=== "[object array]";}Kangaxは、値の内蔵ToString()メソッドを呼び出すと、すべてのブラウザで標準文字列結果を返すことがわかりました。配列の場合、返された文字列は「[オブジェクトアレイ]」であり、配列インスタンスが構築されるフレームを考慮する必要はありません。この方法は、組み込みのオブジェクトを識別するときに非常に便利なことがよくありますが、この方法をカスタムオブジェクトに使用しないでください。
ecmascript5は、array.isarray()をJavaScriptに正式に導入します。唯一の目的は、値が配列であるかどうかを正確に検出することです。 Kangaxの関数と同様に、array.isarray()もフレーム間に渡された値を検出することができます。そのため、多くのJavaScriptクラスライブラリが現在この方法を同様に実装しています。
function isArray(value){if(typeof array.isarray === "function"){return array.isarray(value);} else {return object.prototype.tostring.call(value)=== "[object array]";}}}}IE 9+、Firefox 4+、Safari 5+、Opera 10.5+、およびChromeはすべてArray.isarray()メソッドを実装します。
プロパティを検出します
NULL(および未定義)の別のシナリオは、次のようなオブジェクトに属性が存在するかどうかを検出するときです。
// bad writing:false valuesの検出if(object [propertyname]){// code} // bad writing:null if(object [propertyname]!= null){// code} //悪い書き込み:woodefined if(object [propertyname]!= undefined){// some code}と比較上記のコードの各判断は、与えられた名前で言及されている属性が存在するかどうかを判断するのではなく、与えられた名前で属性の値を実際にチェックします。最初の判断では、プロパティ値が次のような虚偽の値である場合、結果はエラーになります。
属性が存在するかどうかを判断する最良の方法は、in operatorを使用することです。 In Operatorは、プロパティの価値を読み取らずにプロパティが存在するかどうかを単に判断します。インスタンスオブジェクトのプロパティが存在するか、オブジェクトのプロトタイプから継承する場合、in operatorはtrueを返します。例えば:
var object = {count:0、related:null}; //良い書き込みif( "count" in object in object){//ここのコードは実行されます} {//ここのコードは実行されません}インスタンスオブジェクトの特定のプロパティが存在するかどうかを確認するだけの場合は、hasownProperty()メソッドを使用します。オブジェクトから継承されたすべてのJavaScriptオブジェクトには、この方法があります。このプロパティがインスタンスに存在する場合、それはtrueを返します(このプロパティがプロトタイプにのみ存在する場合、falseを返します)。 IE 8以前のバージョンのIEでは、DOMオブジェクトはオブジェクトから継承されないため、この方法には含まれないことに注意する必要があります。つまり、呼び出す前に、domオブジェクトのhasownproperty()メソッドが存在するかどうかを確認する必要があります。
//これは、(object.hasownproperty( "related")){//ここでコードを実行するif(object.hasownproperty(ここでコードを実行})を記述する良い方法です。IEのIE 8以前のバージョンがあるため、インスタンスオブジェクトの属性が存在するかどうかを判断するとき、私はin operatorを使用することを好みます。 hasownProperty()は、インスタンスプロパティを判断するときにのみ使用されます。
プロパティの存在を検出する必要がある時期に関係なく、in operatorまたはhasownProperty()を使用してください。これを行うと、多くのバグを回避できます。
上記は、編集者によって導入された元の値、参照値、および属性のJavaScript検出です。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!