Number()とnew Number()の違いと簡単な輪を作ること.

7195 ワード

JavaScript文書を見て、このような使い方に気づきました. var n 1=Number(123); , 最初の疑問は和です. var n 2=new Number(123); どんな違いがありますか 
 
  まずtypeofで調べてみます.n 1はnumberでn 2はobjectです.彼らの本質的な違いはtypeです.
 
  それなら面白い問題が来ました.Number内部ではどうやって呼び出されたのか分かります.もしNumberがない場合、類似の種類を実現するにはどうすればいいですか?
 
  最初に思いついたのはcalerによって区別されますが、実験の過程で二つの問題が発見されました.
  • グローバル呼び出し時にはコール
  • がありません.
  • callerを知っていてもFnction呼出しかそれとも構造オブジェクト
  • かは区別できません.
     
      だからcalerのこの道は通れなくなりました.運行期間で区別する必要があるなら、「愛」です. this 登场しました.thisは现在の构造の対象を指しています.functionと构造オブジェクトを区别できます.
     
      私の新しい車輪はWNumberと名づけました.構想がはっきりしたら、工事が残っています.Numberに近い行為のために、着工前にテストデータで調べてみます.
     
    console.log(Number(123));      //123
    console.log(Number(+123));     //123
    console.log(Number(-123));     //-123
    console.log(Number("123"));    //123
    console.log(Number("+123"));   //123
    console.log(Number("-123"));   //-123
    console.log(Number("abc123")); //NaN
    console.log(Number(NaN));      //NaN
    
    
    console.log(new Number(123)); //save as above except type
    console.log(new Number(+123));
    console.log(new Number(-123));
    console.log(new Number("123"));
    console.log(new Number("+123"));
    console.log(new Number("-123"));
    console.log(new Number("abc123"));
    console.log(new Number(NaN));
     
      WNumberのソースコードは最后に贴り付けられました.まず问题と処理の考え方を言います.テストの过程で発见されました. 123==new Number('123') trueに戻るのですが、私たちのです. 123==new WNumber('123') しかしfalseに戻り、WNumberの国民的待遇をブラウザが与えないということですか?
     
      まずブラウザは123 aut-boxをNumberオブジェクトにすることができません.二つのオブジェクト==falseのために、Numberオブジェクトaut-unboxを元のtypeにする必要があります.ドキュメントオブジェクトを調べたら、valueOf()メソッドがこのオブジェクトの元の開始値に戻ります.いずれの方法を実現してもブラウザをtrueに戻すことができます.
     
    次はWNumberのソースコードを実現します.
        function WNumber(i){
            
            var primitiveValue = 0;
            
            if(typeof i === "number"){
                    primitiveValue = i;
            }else{
                var regR = /^([\+\-]?)([0-9]+)$/.exec(i);//                  
                if(regR !== null){
                    var nstr = regR[2];//      ,   Java group(2)
                    var nstrlen = nstr.length;
                    var nResult = arguments.callee(0);//callee   function
                    for(idx in nstr){
                        //    ASCII         ,    
                        nResult += (nstr[idx].charCodeAt(0) - "0".charCodeAt(0)) * Math.pow(10, nstrlen - idx -1);
                    }
                    if(regR[1] === "-"){//     
                        primitiveValue = -nResult;
                    }else{
                        primitiveValue = nResult;
                    }
                    
                }else{
                    primitiveValue = NaN;
                }
            }
            
            if(this instanceof WNumber){
                //construct object
                this.valueOf = function(){
                    return primitiveValue;
                }
                
                this.toString = function(){
                    return primitiveValue + '';
                }
                return this;
            }else{
                //invoke as function
                return primitiveValue;
            }
        }
     
     
    追記:stringを素早くnumberに変換する方法は? 「123」*1=123 , これは文法の飴です. Number(「123」)*1 , だからASCIIコードの差を計算することにしました.