javascript
javascript底层练习
1.請(qǐng)看下列代碼:
function F(){function C(){ return this; } return C(); } var o=new F();請(qǐng)問上面的this值指向的是全局對(duì)象還是對(duì)象o?
答:全局對(duì)象。
在
?
這里面this指向了全局對(duì)象,?
在return C();時(shí),調(diào)用C方法,返回了全局對(duì)象,
然后return了全局對(duì)象。
在new構(gòu)造函數(shù)時(shí),如果構(gòu)造函數(shù)沒有return語(yǔ)句,返回的是構(gòu)造函數(shù)的this,如果有return語(yǔ)句,并且return的是一個(gè)對(duì)象,那么new出來的就是return的這個(gè)對(duì)象;如果return一個(gè)基本類型的對(duì)象,那么new出來還是構(gòu)造函數(shù)的this。
所以在最后return C()的時(shí)候相當(dāng)于return 全局對(duì)象,全局對(duì)象不是基本類型,所以o指向的全局對(duì)象。
2.下面代碼的執(zhí)行結(jié)果會(huì)是什么?
function C(){this.a=1; return false; } console.log(typeof new C());?
跟上面這個(gè)題考點(diǎn)一樣啊。。。
輸出object
3.下面這段代碼的執(zhí)行結(jié)果又將是什么?
var c=[1,2,[1,2]]; c.sort(); c.join("--"); console.log(c);- 1
- 2
- 3
- 4
答:[1,[1,2],2]
sort完以后數(shù)組變成這樣,join方法不改變數(shù)組。
如果題目是
?
最后輸出join的結(jié)果,是 1-1,2-2?
這個(gè)結(jié)果好有迷惑性,如果沒想通仔細(xì)想一下,我是暈了會(huì)才發(fā)現(xiàn)就這樣啊。。。
4.在String()構(gòu)造函數(shù)不存在的情況下自定義一個(gè)MyString()的構(gòu)造器函數(shù)。記住,由于String()不存在,因此您在寫構(gòu)造器函數(shù)時(shí)不能使用任何屬于內(nèi)建String對(duì)象的方法和屬性。并且要讓您所創(chuàng)建的對(duì)象通過以下測(cè)試:
var s = new MyString("hello"); s.length; //5s[0]; //"h" s.toString(); //"hello" s.valueOf(); //"hello" s.charAt(1); //"e" s.charAt("2"); //"l" s.charAt("e"); //"h" s.concat(" world!"); //"hello world!" s.slice(1,3); //"el" s.slice(0,-1); //"hell" s.split("e"); //["h","llo"] s.split("l"); //["he","","o"]?
如果您覺得這個(gè)練習(xí)很有趣,可以不用止步于join()方法,繼續(xù)為其創(chuàng)建盡可能多的方法。
參考答案:
function MyArray(){this.length=arguments.length; for(var i=0;i<this.length;i++){ this[i]=arguments[i]; } this.toString=function(){ var resultStr=""; for(var i=0;i<this.length;i++){ if(i===this.length-1){ resultStr+=this[i].toString(); }else{ resultStr+=this[i].toString()+","; } } return resultStr; }; this.push=function(obj){ this[this.length]=obj; this.length++; return this.length; }; this.pop=function(){ if(this.length===0){ return null; } result=this[this.length-1]; this[this.length-1]=undefined; this.length--; return result; }; this.join=function(str){ var resultStr=""; for(var i=0;i<this.length;i++){ if(i===this.length-1){ resultStr+=this[i].toString(); }else{ resultStr+=this[i].toString()+str; } } return resultStr; } }?
7.在Math對(duì)象不存在的情況下,創(chuàng)建一個(gè)類似的MyMath對(duì)象,并為其添加以下方法:
1)MyMath.rand(min,max,inclusive)-隨機(jī)返回min到max區(qū)間中的一個(gè)數(shù),inclusive為true時(shí)為閉區(qū)間(這也是默認(rèn)情況)。
2)MyMath.min(array)-返回目標(biāo)數(shù)組中的最小值。
3)MyMath.Max(array)-返回目標(biāo)數(shù)組中的最大值。
參考答案:
function MyMath(){}MyMath.rand=function(min,max,inclusive){ if(typeof min!=="number"){ throw new Error("type error"); return; } if(typeof max!=="number"){ throw new Error("type error"); return; } if(min>max){ throw new Error("parameter error"); return; } if(typeof inclusive==="undefined"){ inclusive=true; }else{ inclusive=!!inclusive; } if(inclusive){ if(Math.random()>0.5){ return min+(max-min)*Math.random(); }else{ return max-(max-min)*Math.random(); } }else{ //不閉合區(qū)間,先排除0的可能 var randomNum=Math.random(); while(randomNum===0){ randomNum=Math.random(); } return min+(max-min)*randomNum; } }; MyMath.min=function(){ if(arguments.length===0){ throw new Error("no parameter"); return; } var minValue; var l=arguments.length; for(var i=0;i<l;i++){ var param=arguments[i]; if(typeof param!=="number"){ throw new Error("parameter error"); return; } if(i===0){ minValue=param; } if(minValue>param){ minValue=param; } } return minValue; }; MyMath.max=function(){ if(arguments.length===0){ throw new Error("no parameter"); return; } var maxValue; var l=arguments.length; for(var i=0;i<l;i++){ var param=arguments[i]; if(typeof param!=="number"){ throw new Error("parameter error"); return; } if(i===0){ maxValue=param; } if(maxValue<param){ maxValue=param; } } return maxValue; };?
轉(zhuǎn)載于:https://www.cnblogs.com/hngdlxy143/p/9736620.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的javascript底层练习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LibreOj 6279数列分块入门 3
- 下一篇: javascript forEach无法