JavaScriptタイプの検査について話してください.

4495 ワード


javascriptに内蔵されているタイプの検出メカニズムは完全に信頼できるものではない.たとえば、typeofオペレータは、データがどのタイプかを正確に判断できません.たとえば、配列とオブジェクトはtypeofで区別できません.
typeof [] ==="object" ; // true
typeof {} === "object"; // true
ただし、typeofは、オブジェクトと基本データタイプを区別するために用いられます.
基本データタイプ検出
typeofは、すべてのオブジェクトと配列タイプに対して返されるのが「object」なので、オブジェクトと基本データタイプを区別するときに役立ちます.typeofオペレータを使用すると、次の文字列に戻ります.文字列に注意してください.
「undefined」はこの値が定義されていないことを意味します.
ブーランはこの値がブール値であることを意味します.
「string」はこの値が文字列であることを表します.
numberはこの値が数値であることを表します.
「Object」は、この値が対象またはnullであることを示しています.(typeof nullは「Object」に戻り、タイプの合法性を正確に判断できないので、typeofで対象タイプを検出することはできません.)
「function」はこの値が関数であることを表しています.(注意:Safari第4版は正則表現にtypeof操作符を使うと「function」に戻りますので、この値が関数かどうかは分かりにくいです.)
参照タイプ検出
JavaScript引用タイプは、Object、Aray、Date、Error、RegExp、Funct、基本パッケージタイプ(Booleanタイプ、Numberタイプ、Stringタイプ)、単体内蔵オブジェクト(Globalオブジェクト、Mathオブジェクト)などがあります.参照の種類を検出するには、instance ofおよびObject.toString()方法が使用されてもよい.
instance of演算子
instance of演算子は、左の演算数がオブジェクトで、右の演算数がオブジェクトの名前です.演算子の左のオブジェクトが右のクラスの一例である場合、trueに戻ります.そうでなければfalseに戻ります.たとえば:
var d = new Date();

d instanceof Date; // true
d instanceof Object; // true
d instanceof Number ; //false 

var a = [];
a instanceof Array ; // true
a instanceof Object; // true
a instanceof RegExp; // false
ただし、instance ofオペレータを利用して、あるオブジェクトが配列であるかどうかを判定するのに問題があります.例えば、
if( value instanceof Array ) {
  // do something
}
instance ofオペレータの問題は、グローバル実行環境が一つしかないと仮定することです.ウェブページに複数のフレームが含まれている場合、2つ以上の異なるグローバル実行環境が存在し、2つ以上の異なるAray構造関数が存在する.一つのフレームから他のフレームに一つの配列が入ってくると、入ってきた配列と第二のフレームの中で元から作成した配列はそれぞれ異なる構造関数を持っています.したがって、第二のフレームでは、入ってきた配列に対してvalue instance of Arayを実行するとfalseに戻ります.構造関数は違っています.
Object.toString()検出対象タイプ
元のString()を任意の値で呼び出すと、「object native ControuctoName」形式の文字列が返されます.各クラスには内部に[クラス]の属性があります.この属性は上記の文字列の構造関数名を指定します.たとえば:
//       
function isArray(value){
   return Object.prototype.toString.call(value) == "[object Array]"  
}

//     
function isFunction(value){
   return Object.prototype.toString.call(value) == "[object Function]"  
}

//        
function isRegExp(value){
   return Object.prototype.toString.call(value) == "[object RegExp]"  
}
 注意:IEでCOMオブジェクトとして実装された任意の関数については、元のJavaScript関数ではないので、isFunction()はfalseに戻ります.
jQuery検出対象タイプもtoStering()メソッドを使用しており、type()メソッドを確認することができます.
//version:jquery-1.11.3

var class2type = {};
// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
    class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
type: function( obj ) {
        if ( obj == null ) {
            return obj + "";
        }
        return typeof obj === "object" || typeof obj === "function" ?
            class2type[ toString.call(obj) ] || "object" :
            typeof obj;
    }
 すべてのタイプのtoStering()の戻り値を、class 2 typeオブジェクトを定義することにより、キーのペアで格納します.typeメソッドを呼び出した時にtoString()で値を返してマッチングし、最後に検出値の種類を返します.
締め括りをつける
基本データタイプとオブジェクトタイプを区別する際には、type of演算子が使用され、オブジェクトのタイプ決定には通常、元のString()を使用して検出されるので、Object.prototype.toString()自体も修正される可能性があります.
以上はJavaScriptタイプの検査のいくつかの基礎知識の総括で、干物は多くなくて、各位の大神の指導を望んで、メッセージの討論を歓迎します.