JavaScriptデータ型検出の詳細

16198 ワード

//JSはどのようにデータの種類を検出しますか?
//キーワード使用:typeof
//出力結果:'number','string','boolean'.
1 console.log(typeof 17);
2 console.log(typeof '17');
3 console.log(typeof true);
//出力結果:'object','undefined'の順
1 console.log(typeof null);
2 console.log(typeof undefined);
//わかりました:nullはobjectタイプです.
//出力結果は「number」,「object」.String('17')、new String('17');
1 console.log(typeof Number(17));
2 console.log(typeof new Number(17));
//出力結果:'string','object'の順
1 console.log(typeof String('17'));
2 console.log(typeof new String('17'));
//同理:'boolean','object'.
1 console.log(typeof Boolean(true));
2 console.log(typeof new Boolean(true));
//Why ?//newキーワードを使用することは、新しいオブジェクトを構築することです.新Number()はnumberオブジェクトを構築します.//新Number(17)は、17のパッケージタイプのオブジェクトである.単純なNumber(17)は強制変換であり,転換関数である.newを使用して基本パッケージタイプの構築関数を呼び出すのは、同じ名前の変換関数を直接呼び出すのとは異なります.//次の例を見てfalse,true,falseの順に出力します.
1 console.log((17) instanceof Number);
2 console.log(new Number(17) instanceof Number);
3 console.log(Number(17) instanceof Number);
//Javaプログラミングでは、元のタイプに対してJava APIが対応するパッケージオブジェクトを提供していることがわかります.//ではJSプログラミングでは、JSは3つのオリジナルタイプに対しても対応するパッケージオブジェクトを提供しています:Number,String,Boolean.//同じ理屈はString、Booleanに適用される. 
//続いて下を見る.//出力結果:'object','object','function'
1 console.log(typeof []);
2 console.log(typeof {});
3 console.log(typeof function(){});
/'object',阴魂不散,真讨厌.//問題が来ました.これらの「object」をどのように正確に判断すればいいのでしょうか.
//call,applyの方法をご紹介します.//JSでは、関数は一等公民です.オブジェクトを構築したり、値として使用したりできます.//宣言関数は簡単です
 1 function f1(){
 2   console.log("         function");
 3 }
 4 function f2(num1,num2){
 5   console.log("          。"+num1+num2);
 6 }
 7 function f3(who){
 8   console.log("hello "+who);
 9   return "         ";
10 }
//呼び出し関数はかなり簡単です.カッコのペアで、パラメータが必要な場合はパラメータが付きます.
f1();f2(1,2);console.info(f3('china'));
//関数式については、関数を値として、後でパッケージを閉じるときに話します.//関数パラメータについて
 1 function test(num1,num2){
 2   console.log(num1);
 3   num1=10;
 4   console.log(arguments[0]+" "+num2);
 5   arguments[0]=2;
 6   console.log(num1+" "+num2);
 7   console.log(arguments instanceof Array);
 8   console.log(arguments.toString());
 9 }
10 test(0,1);
//JSでは、システムにargumentsという東からメンテナンス関数を行うパラメータがあります.ArgumentはArrayの例ではありません.//しかしargumentsは、角カッコ構文を使用してパラメータにアクセスできる要素、//length属性を使用してパラメータの個数を取得するなどの配列のような特性を持っています.
1 function f4(arg1,arg2,arg3){
2   console.log(arguments.length);
3   for(var index=0,length=arguments.length;index<length;index++){
4   console.log(arguments[index]);
5   }
6 }
7 f4('  ',"  ");
8 f4('I ','am ','dylan');
9 f4('I ','am ','dylan','!!!');
//argumentsクラス配列管理パラメータがあるからこそ、パラメータ伝達時にJSはパラメータの個数を考慮しない.//同時にtest関数を観察するとnum 1とargument[0]の値は等しいだけでなく、同期して変化していることがわかります.//従来のオブジェクト向けプログラミングでは、コンストラクション関数はリロードできますが、JSではリロードされません.//functionもオブジェクトです.
console.log(function(){} instanceof Object);
//拡張するとfunctionがオブジェクトである以上、関数名は関数へのポインタです.//オブジェクトである以上、対応するプロパティとメソッドが必要です.functionにはlength、prototypeプロパティ(このプロパティは後述します)/apply、callメソッドがあります.
 1 function testLength1(){
 2  console.log("testLength1.length="+testLength1.length);
 3  console.log("    ,  length 0。");
 4  console.log("arguments.callee.length="+arguments.callee.length);
 5 }
 6 function testLength2(name){
 7  console.log("testLength2.length="+testLength2.length);
 8  console.log("     ,     1");
 9  console.log("arguments.callee.length="+arguments.callee.length);
10  console.log("arguments.length="+arguments.length);
11 }
12 
13 testLength1();
14 testLength2(); //  
15 testLength2("dylan");
16 console.info(testLength1.length);
17 console.info(testLength2.length);
//一目瞭然でしょう:length属性は、関数が受信したいネーミングパラメータの数を表します.//Argumentsはクラス配列で、主な役割は関数のパラメータを管理することです.//arguments.calleeは現在の関数名を表し、この例ではtestLenght 2.//argumentを使用します.calleeは再帰的にとても役に立ちます.興味のある人は探してみてください.//関数のlengthプロパティと関数呼び出し時に実際に受信したパラメータ値は必ずしも等しくありません.
//functionごとに2つの方法があります:apply,call.役割は、指定した関数(オブジェクト)を実行するコンテキストです.
 1 var o1 ={
 2  name: 'dylan',
 3  getName: function(){
 4  return this.name;
 5 },
 6  setName: function(greet,name){
 8  return greet+" , "+ name
 9  }
10 }
11 
12 var o2 ={
13  name: 'bady',
14  getName: function(){
15  return this.name;
16  }
18 }
19 //var o3={name:'hello'};
20 var o3={};
//o 1のgetNameを呼び出す方法で、指定したコンテキストオブジェクトはo 3ですが、o 3にはname属性がないのでundefinedを返します.
console.log(o1.getName.call(o3));
//o 1のgetNameを呼び出す方法.このコンテキストオブジェクトはo 2です.だから戻って
console.log(o1.getName.call(o2));
//callはapplyと大きく区別されず、主にapplyパラメータが配列である.
1 console.log(o1.setName.call(o2,'Hi',' tony '));
2 console.log(o1.setName.apply(o2,['Hi',' fred ']));
3 //console.log(o1.setName.apply(o2,'Hi',' fred '));
//ok、こんなにたくさん言って、今typeofに戻ります
 1 function toType(type){
 2   if(arguments.length==0){
 3   return ;
 4 }
 5  if((typeof type)!=='object'){
 6  return typeof type;
 7 }
 8 
 9 //return ({}).toString.call(type);
10  return ({}).toString.call(type).match(/\s(\w+)/)[1];
11 }    
12 console.log(toType([12]));
13 console.log(toType({}));
14 console.log(toType(function(){}));
15 console.log(toType(17));
16 console.log(toType('17'));
17 console.log(toType(false));
18 console.log(toType(new Number(17)));
19 console.log(toType(null));
20 console.log(toType(undefined));
21 console.log(toType(String("dylan")));
//toTypeはこのように最適化することもできます.//return ({}).toString.call(type).match(/\s(\w+)/)[1];
//最後にtoLowerCaseメソッドを呼び出すこともできます.
//return ({}).toString.call(type).match(/\s(\w+)/)[1].toLowerCase();