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に近い行為のために、着工前にテストデータで調べてみます.
WNumberのソースコードは最后に贴り付けられました.まず问题と処理の考え方を言います.テストの过程で発见されました. 123==new Number('123') trueに戻るのですが、私たちのです. 123==new WNumber('123') しかしfalseに戻り、WNumberの国民的待遇をブラウザが与えないということですか?
まずブラウザは123 aut-boxをNumberオブジェクトにすることができません.二つのオブジェクト==falseのために、Numberオブジェクトaut-unboxを元のtypeにする必要があります.ドキュメントオブジェクトを調べたら、valueOf()メソッドがこのオブジェクトの元の開始値に戻ります.いずれの方法を実現してもブラウザをtrueに戻すことができます.
次はWNumberのソースコードを実現します.
追記:stringを素早くnumberに変換する方法は? 「123」*1=123 , これは文法の飴です. Number(「123」)*1 , だからASCIIコードの差を計算することにしました.
まずtypeofで調べてみます.n 1はnumberでn 2はobjectです.彼らの本質的な違いはtypeです.
それなら面白い問題が来ました.Number内部ではどうやって呼び出されたのか分かります.もしNumberがない場合、類似の種類を実現するにはどうすればいいですか?
最初に思いついたのはcalerによって区別されますが、実験の過程で二つの問題が発見されました.
だから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コードの差を計算することにしました.