JavaScriptタイプの判断
5664 ワード
JS(ES 6)の基本データタイプ:1.数値型(Number):整数、浮動小数点数、2.ブール型(Boolean)、3.文字列型(String)、4.配列(Aray)、5.空値(Null)、6.未定義(Unidefined)を含み、基本データタイプは値でアクセスします.
引用タイプ:Object、Aray、Function、Data、参照データタイプは、スタックメモリに保存されているオブジェクトです.
1.typeof
まとめ:typeof対null、undefined、NaN、配列、正則、ObjectのタイプはすべてObjectです.
2.constructor
constructorは変数の原型を判断するために用いられ、constructor属性はこのオブジェクトを作成する配列関数に対する参照を返します.
関数Fが定義されると、JSエンジンはFにプロトタイプを追加し、プロトタイプにconstructor属性を追加してFに向けて参照させます.var f=new F()を実行するとFはコンストラクション関数として扱われます.fはFのインスタンスオブジェクトです.このときFプロトタイプのconstructtorはfに伝えられます.
内蔵オブジェクトは内部構築時に余裕があると判断します.
注: nullとundefinedは無効なオブジェクトですので、constructorが存在しないので、この2つのタイプのデータは他の方法で判断する必要があります. constructor属性は必ずしも構造関数を指すものではなく、彼も修正・変更できるものです.
instance of
instance of演算子は、オブジェクトがそのプロトタイプチェーンに配置関数のプロトタイプ属性が存在するかどうかをテストします.
ベースのタイプ
行列とオブジェクト、さらには関数などの複雑なタイプは、ベースタイプとは異なります.
複雑なタイプ
その他のタイプ aはnewであるため、構造されているので、すでに対象であり、関数ではないので、false aは構成されたオブジェクトで、tureに戻っても大丈夫です. Aは関数です.これは大丈夫です.
{}.toString.call(obj)
使い方は以下の通りです
注意:callまたはapplyで呼び出さなければならず、直接toStringを呼び出すことができず、プロトタイプチェーンの観点から、すべてのオブジェクトのプロトタイプチェーンは最終的にObjectを指し、JS変数に従って規則を検索し、他のオブジェクトも直接ObjectのtoString方法にアクセスできるはずであるが、事実上、ほとんどのオブジェクトは自分のtostring方法を実現している.これでObjectのtoStringが検索を終了する可能性がありますので、ObjectのtoStringメソッドをコール/applyで強制的に呼び出します.
jQueryの中の方法です.type()は、toStringを使いました.
JSタイプの判断、typeof/constructor/instance ofの違いjsのconstructorとprototypeJSタイプの判断jqueryソースがjsのconstructor属性の神秘的なベールを開くと判断します.
引用タイプ:Object、Aray、Function、Data、参照データタイプは、スタックメモリに保存されているオブジェクトです.
1.typeof
var a;
console.log("1:" + typeof a);
var b = null;
console.log("2:" + typeof b);
var c = undefined;
console.log("3:" + typeof c);
var d = new Object;
console.log("4:" + typeof d);
var e = function() {};
console.log("5:" + typeof e);
var f = {};
console.log("6:" + typeof f);
var g = '';
console.log("7:" + typeof g);
var h = [];
console.log("8:" + typeof h);
var i = true;
console.log("9:" + typeof i);
var j = 123;
console.log("10:" + typeof j);
var k = NaN;
console.log("11:" + typeof k);
var l = /^[-+]?\d+$/;
console.log("12:" + typeof l);
印刷結果は以下の通りですまとめ:typeof対null、undefined、NaN、配列、正則、ObjectのタイプはすべてObjectです.
2.constructor
constructorは変数の原型を判断するために用いられ、constructor属性はこのオブジェクトを作成する配列関数に対する参照を返します.
関数Fが定義されると、JSエンジンはFにプロトタイプを追加し、プロトタイプにconstructor属性を追加してFに向けて参照させます.var f=new F()を実行するとFはコンストラクション関数として扱われます.fはFのインスタンスオブジェクトです.このときFプロトタイプのconstructtorはfに伝えられます.
var F = function(){}
console.log(F.prototype);
var f = new F();
console.log(f.constructor===F) //true
Fはプロトタイプのオブジェクトのconstructorを利用して自身を引用し、Fがコンストラクションとしてオブジェクトを作成すると、プロトタイプのconstructorが新たに作成されたオブジェクトに遺伝し、プロトタイプのチェーンから言えば、構造関数Fは新しいオブジェクトのタイプであることが分かります.このようにする意味は、新しいオブジェクトが誕生した後に、追跡可能なデータタイプ、つまりオブジェクトのconstructor属性が彼の構造関数を指すということです.内蔵オブジェクトは内部構築時に余裕があると判断します.
注:
instance of
instance of演算子は、オブジェクトがそのプロトタイプチェーンに配置関数のプロトタイプ属性が存在するかどうかをテストします.
:String、Number、Boolean、Undefined、Null、Symbol(ES6 Symbol, );
:Array,Object;
:Function、RegExp、Date。
var obj = new Object()
obj instanceof Object // true
注意左側は対象でなければなりません.そうでなければ、直接falseに戻ります.var num = 1
num instanceof Number // false
num = new Number(1)
num instanceof Number // true
全部numであり、しかも全部1であることが分かります.最初は対象ではないので、基本タイプです.直接falseに戻ります.二つ目は対象となります.だからtrue.ここではこの問題に厳重に注意します.プロト.構造関数のプロトタイプと同じでtrueに戻ります.これは厳密ではありません.ベースのタイプ
var num = 1
num.__proto__ === Number.prototype // true
num instanceof Number // false
num = new Number(1)
num.__proto__ === Number.prototype // true
num instanceof Number // true
num.__proto__ === (new Number(1)).__proto__ // true
上記の例では、1とnew Number(1)はほぼ同じで、対象としてカプセル化されているかどうかを区別するだけで、instance ofの結果は違っています.string、bollanなど、これらの基本タイプは同じです.new String(1) // String {"1"}
String(1) // "1"
new String(1)はStering(1)とは違って、newは対象としてパッケージ化されていますが、newがないのはベースタイプの変換だけですか?それともベースタイプの他のベースタイプと同じですか?行列とオブジェクト、さらには関数などの複雑なタイプは、ベースタイプとは異なります.
複雑なタイプ
var arr = []
arr instanceof Array // true
arr instanceof Object // true
Array.isArray(arr) // true
複雑なタイプは文面量から直接構造関数を生成するので、基本タイプのように二種類の場合はありません.しかし、上記の問題はもちろん、基本タイプにもこの問題があります.Objectと比較します.仕方ないです.Objectはプロトタイプの上の階にありますので、trueに戻ります.(new Number(1)) instanceof Object // true
下から上に行くので、例えばNumberだと判断したらObjectかどうか判断する必要がありません.もうNumberですから.その他のタイプ
var reg = new RegExp(//)
reg instanceof RegExp // true
reg instanceof Object // true
var date = new Date()
date instanceof Date // true
date instanceof Object // true
Function, , Function :
function A() {}
var a = new A()
a instanceof Function // false
a instanceof Object // true
A instanceof Function // true
ここで注意してください.function A(){}はvar Aに相当します.A=function(){}を分析します.{}.toString.call(obj)
使い方は以下の通りです
console.log({}.toString.call(1));
console.log({}.toString.call("11"));
console.log({}.toString.call(/123/));
console.log({}.toString.call({}));
console.log({}.toString.call(function() {}));
console.log({}.toString.call([]));
console.log({}.toString.call(true));
console.log({}.toString.call(new Date()));
console.log({}.toString.call(new Error()));
console.log({}.toString.call(null));
console.log({}.toString.call(undefined));
console.log(String(null));
console.log(String(undefined));
下記に戻ります注意:callまたはapplyで呼び出さなければならず、直接toStringを呼び出すことができず、プロトタイプチェーンの観点から、すべてのオブジェクトのプロトタイプチェーンは最終的にObjectを指し、JS変数に従って規則を検索し、他のオブジェクトも直接ObjectのtoString方法にアクセスできるはずであるが、事実上、ほとんどのオブジェクトは自分のtostring方法を実現している.これでObjectのtoStringが検索を終了する可能性がありますので、ObjectのtoStringメソッドをコール/applyで強制的に呼び出します.
jQueryの中の方法です.type()は、toStringを使いました.
type: function( obj ) {
if ( obj == null ) {
return obj + "";
}
// Support: Android<4.0, iOS<6 (functionish RegExp)
return typeof obj === "object" || typeof obj === "function" ?
class2type[ toString.call(obj) ] || "object" :
typeof obj;
},
解析ソースコード:typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call(obj) ]
着信タイプを判断することで、objectまたはfunctionタイプであれば直接にclass 2 typeのキーに戻るのが正しい結果です.そうでなければ、必ず基本タイプです.typeofを通過すればいいです.class2type[ toString.call(obj) ] || "object"
これはいくつかの未知の状況を防ぐために、取れなかったら、objectに戻り、プログラムの利用可能性を保証します.JSタイプの判断、typeof/constructor/instance ofの違いjsのconstructorとprototypeJSタイプの判断jqueryソースがjsのconstructor属性の神秘的なベールを開くと判断します.