亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

前端開發面試題總結之——JAVASCRIPT(三)

2019-11-08 02:28:28
字體:
來源:轉載
供稿:網友

http://www.jianshu.com/p/988840419605

相關知識點

數據類型、運算、對象、function、繼承、閉包、作用域、原型鏈、事件、RegExp、JSON、Ajax、DOM、BOM、內存泄漏、跨域、異步加載、模板引擎、前端MVC、前端MVVM、路由、模塊化、Http、Canvas、jQuery、ECMAScript 2015(ES6)、Node.js、AngularJS、Vue、React......

題目&答案

函數記憶,判斷是不是質數.方法一:function isPRime1(n){ if(n<=3){return true} else{ for(var i=2;i<Math.sqrt(n);i++){ if(n%i==0){return false;} } return true; }};方法二:hash var isPrime2=(function(){//hash var hash={}; return function(n){ if(n<=3){return true} else if(hash[n]!==undefined){ return hash[n]; }else{ for(var i=2;i<Math.sqrt(n);i++){ if(n%i==0){return hash[n]=false} } return hash[n]=true; } }})();數組去重方法一:var arr1=[1,2,3,2,1,2]; function repeat1(arr){ for(var i=0,arr2=[];i<arr.length;i++){ if(arr2.indexOf(arr[i])==-1){ arr2.push(arr[i]); } }//(遍歷結束) return arr2;}方法二:hashfunction repeat2(arr){ //遍歷arr中每個元素,同時聲明hash for(var i=0,hash={};i<arr.length;i++){ //hash中是否包含當前元素值的建 //如果不包含,就hash添加一個新元素,以當前元素值為key,value默認為1 if(hash[arr[i]]===undefined){ hash[arr[i]]=1; } }//(遍歷結束) //將hash轉為索引: var i=0; var arr2=[]; for(arr2[i++] in hash); return arr2;}方法三:function repeat3(arr){ return arr.sort() .join(",,") .replace( /(^|,,)([^,]+)(,,/2)*/g, "$1$2") .split(",,"); }console.log(repeat3(arr1));插入排序var arr=[2,4,1,5,3]; function insertSort(arr){ //遍歷arr中每個元素(i從1開始) for(var i=1;i<arr.length;i++){ //將當前元素臨時保存在變量t中 var t=arr[i]; var p=i-1;//聲明變量p=i-1 //循環:(arr[p]>t&&p>=0){ while(arr[p]>t&&p>=0){ //將p位置的值,賦值給p+1位置 arr[p+1]=arr[p]; p--;//p-- }//(循環結束) arr[p+1]=t;//將t放在p+1的位置上 }//(循環結束) } insertSort(arr);console.log(String(arr));快速排序: function quickSort(arr){ //如果arr的length<=1 if(arr.length<=1){ return arr;//就直接返回arr } //計算參照位p var p=Math.floor(arr.length/2); var left=[]; var right=[]; //刪除p位置的元素 var center=arr.splice(p,1)[0]; //遍歷arr中每個元素 for(var i=0;i<arr.length;i++){ if(arr[i]>=center){ right.push(arr[i]); }else{ left.push(arr[i]); } } return quickSort(left) .concat(center,quickSort(right)) } var sortedArr=quickSort(arr); console.log(String(sortedArr));正則表達式(1) "ryan5 is6 not7 a8 good9 man10"var n=5;var str="ryan is not a good man";str=str.replace(//b[a-z]+/b/g,function(kw){ return kw+n++;});console.log(str);統計字符串中每種字符出現的次數,出現次數最多的是? 出現?次 var str="helloworld"; 方法一:用hash for(var i=0,hash={};i<str.length;i++){ if(hash[str[i]]){ hash[str[i]]++ }else{ hash[str[i]]=1; } } console.dir(hash);方法二:用正則var arr=str.split("") .sort() .join("") .match(/([a-z])/1*/g) .sort(function(a,b){return b.length-a.length; })console.log("出現最多的是: "+arr[0][0] +"共"+arr[0].length+"次");var hash={}; arr.forEach(function(val){ hash[val[0]]=val.length; }); console.dir(hash);數組降維var arr=[ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0], ]; //method 1: for(var r=0,arr1=[];r<arr.length;r++){ for(var c=0;c<arr[r].length;c++){ arr1.push(arr[r][c]); } } console.dir(arr1); //method 2: for(var r=0,arr2=[];r<arr.length;r++){ arr2=arr2.concat(arr[r]); } console.dir(arr2);//method 3: var arr2=[].concat.apply([],arr); console.dir(arr2);Function賦值 var f=function(){var a=b=1;} f(); console.log(b);//1 console.log(a);//報錯 var f=function(){var a=b=1;} setTimeout(f,0); console.log(b);//報錯 f(); var a,b=0, fn=function(){var a=b=2;} fn(); console.log(a);//undefined console.log(b);//2函數currying(柯里華) var getN; function add(n){ getN=function(){console.log(n);} return function(m){ n+=m; arguments.callee.toString=function(){ return n; } return arguments.callee; } } add(1)(2)(3); getN();//6 add(1)(2)(3)(4); getN();//10 alert(add(1)(2)(3));//6 alert(add(1)(2)(3)(4));//10遞歸var emp={ work:function(){//3,2,1 var sum=0;//+3+2+1 +2+1 +1 for(vari=0; i<arguments.length&&arguments[0]>0; i++){ sum+=arguments[i] +arguments.callee( --arguments[i] ); } return sum; } } console.log(emp.work(3,2,1));//10閉包(1)function fun(n,o){//外層函數 console.log(o); return { fun:function(m){//內層函數 n return fun(m,n); } } } var a=fun(0);a.fun(1); a.fun(2); a.fun(3); //undefined 0 0 0var a=fun(0).fun(1).fun(2).fun(3);//undefined 0 1 2var a=fun(0).fun(1); a.fun(2); a.fun(3);//undefined 0 1 1(2)var a=0,b=0; function A(a){ A=function(b){alert(a+b++)}; alert(a); } A(1);//1 A(12);//13OOP(1)window.a=300; function fn1(){ this.a=100; this.b=200; return function(){ alert(this.a) }.call(arguments[0]) } function fn2(){ this.a=new fn1(); }var a=new fn1().b;//300var v=new fn1(fn2());//[object Object](2)var number=2;//4 8 var obj={ number:4,//8 fn1:(function(){ //var number; this.number*=2;number*=2; //聲明提前 undefined var number=3; return function(){ this.number*=2; number*=3; alert(number); } })() } var fn1=obj.fn1; alert(number); fn1(); obj.fn1(); //4 9 27 alert(window.number);//8 alert(obj.number);//8(3)function Foo(){ getName=function(){alert(1);}; return this;}Foo.getName=function(){alert(2);};Foo.prototype.getName=function(){ alert(3);};var getName=function(){alert(4);};function getName(){ alert(5); };Foo.getName();//2getName();//4Foo().getName();//1getName();//1new Foo.getName();//2new Foo().getName();//3new new Foo().getName();//3(4)var a=1;var b={ a:2, b:function(){ console.log(this.a);//1 }(), f:this.f=function(){ console.log(this.a); }};function f(){ console.log(3); }f();//1b.f();//2(b.f)();//2(0,b.f)();//1(5)var foo=function(){ console.log(this.a);}var obj={a:2,foo:foo};var a=10;var bar=obj.foo;var bar2=foo.bind(obj);bar();//10bar2();//2foo();//10obj.foo();//2setTimeout(bar,0);//10(6)function MyObj(){ this.p.pid++; }MyObj.prototype.p={"pid":0}//2MyObj.prototype.getNum=function(num){ return this.p.pid+num;}var _obj1=new MyObj(); //創建新對象,繼承原型pid+1var _obj2=new MyObj(); //創建新對象,繼承原型pid+2console.log( _obj1.getNum(1)+_obj2.getNum(2));//7 2+1 + 2+2判斷一個對象是不是數組類型,有五種方法:(1) typeof 無法判斷 只能判斷原始類型的值和函數(2)isPrototypeOf 判斷父及對象 可檢查整個原型鏈 //可能繼承自數組 console.log(Array.prototype.isPrototypeOf([])?"是數組":"不是數組"); console.log(Array.prototype.isPrototypeOf({})?"是數組":"不是數組"); console.log(Array.prototype.isPrototypeOf(function(){})?"是數組":"不是數組");(3)constructor 檢查指定對象的構造函數 可檢查整個原型鏈 //可能繼承自數組 var father={}; var son={}; father.__proto__=Array.prototype; son.__proto__=father; console.log(son.contructor==Array?"是數組":"不是數組") console.log({}.contructor==Array?"是數組":"不是數組"); console.log(function(){}.contructor==Array?"是數組":"不是數組");(4)instanceof 檢查一個對象是否是制定構造函數的實例 可檢查整個原型鏈 //可能繼承自數組 var father={}; var son={}; father.__proto__=Array.prototype; son.__proto__=father; console.log(son instanceof Array?"是數組":"不是數組"); console.log({} instanceof Array?"是數組":"不是數組"); console.log(function(){} instanceof Array?"是數組":"不是數組");(5)強行用要檢查的對象,調用原始的toString方法 不檢查整個原型鏈 //[object class]: class-Array Date Object //只能檢查最初就是數組創建的對象。 console.log(Object.prototype.toString.call([])=="[object Array]"?"是數組":"不是數組"); console.log(Object.prototype.toString.call({})); console.log(Object.prototype.toString.call(function(){})); console.log(Object.prototype.toString.call(//d/)); var father={}; var son={}; father.__proto__=Array.prototype; son.__proto__=father; console.log(Object.prototype.toString.call(son)=="[object Array]"?"是數組":"不是數組");//不是 //結論: 對象一旦創建,class屬性就無法修改 //修改繼承關系,也無法修改class屬性(6) Array.isArray(obj) 不檢查整個原型鏈 console.log(Array.isArray([])); console.log(Array.isArray({})); //如果瀏覽器不支持isArray if(Array.prototype.isArray===undefined){//if(!Array.isArray) //給?添加isArray方法 Array.prototype.isArray=function(arg){ //強行調用原始toString方法,和"[object Array]"比較 return Object.prototype.toString.call(arg) =="[object Array]"?"是數組":"不是數組"; } }自定義Object.create()——手寫 Object.create=function(father,props){ console.log("我的create"); /*使用setPrototypeOf方法 var o=Object();//1. 創建空對象 Object.setPrototypeOf(o,father);//2. 繼承father */ /*不使用setPrototypeOf方法 function Constructor(){} Constructor.prototype=father; var o=new Constructor(); */ Object.defineProperties(o,props);//3. 定義新屬性 return o; }深克隆原理Object.clone=function(obj){//深克隆if(typeof(obj)=="object"){//如果obj是對象 var o=//有必要區分數組和普通對象 Object.prototype.toString.call(obj)=="[object Array]"?[]:{}; for(var key in obj){//遍歷obj的自有屬性 //如果key是obj的自有屬性 if(obj.hasOwnProperty(key)){ o[key]=arguments.callee(obj[key]);//arguments.callee調的是當前的Object.clone函數 } } return o; }else{//如果obj是原始類型的值,就直接返回副本 return obj; } }如果瀏覽器不支持every屬性,every的實現原理 if(Array.prototype.every===undefined){ Array.prototype.every=function(fun){ //遍歷當前數組中每個元素 for(var i=0;i<this.length;i++){ if(this[i]!==undefined){//調用fun,依次傳入當前元素值,位置i,當前數組作為參數 ,將返回值,保存在變量r中 var r=fun(this[i],i,this); if(r==false){//如果r為false return false;//返回false } } }//(遍歷結束) return true;//返回true } }如果瀏覽器不支持some屬性,some的實現原理 if(Array.prototype.some===undefined){ Array.prototype.some=function(fun){ for(var i=0;i<this.length;i++){ if(this[i]!==unefined){ var r=fun(this[i],i,this); if(r==true){ return true; } } } return false; } }瀏覽器不支持map屬性,map的實現原理 if(Array.prototype.map===undefined){ Array.prototype.map=function(fun){ //創建空數組: newArr var newArr=[]; //遍歷當前數組中每個元素 for(var i=0;i<this.length;i++){ //如果當前元素不是undefined if(this[i]!==undefined){//判斷稀疏數組//調用fun傳入當前元素值,位置i,當前數組,將結果保存在r中 //將newArr的i位置賦值為r var r=fun(this[i],i,this); newArr[i]=r; } }//(遍歷結束) return newArr;//返回newArr } }如果瀏覽器不支持reduce屬性,reduce的實現原理 if(Array.prototype.reduce===undefined){ Array.prototype.reduce=function(fun,base){ base===undefined&&(base=0); for(var i=0;i<this.length;i++){ if(this[i]!==undefined){ base=fun(base,this[i],i,this); } } return base; } }如果瀏覽器不支持bind屬性, bind函數的實現原理 if(Function.prototype.bind===undefined){ Function.prototype.bind=function(obj/*,參數列表*/){ var fun=this;//留住this //*****將類數組對象,轉化為普通數組 var args=Array.prototype.slice.call(arguments,1); //args保存的就是提前綁定的參數列表 /*function slice(1){ var sub=[]; for(var i=0;i<length;i++){ sub.push(arguments[i]); } return sub; }*/ return function(){ //將后傳入的參數值,轉為普通數組 var innerArgs=Array.prototype.slice.call(arguments);//將之前綁定的參數值和新傳入的參數值,拼接為完整參數之列表 var allArgs=args.concat(innerArgs) //調用原始函數fun,替換this為obj,傳入所有參數 fun.apply(obj,allArgs); } } }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人免费自拍视频| 国产日韩亚洲欧美| 亚洲天堂影视av| 97视频在线观看免费高清完整版在线观看| 久久久久久久影院| 亚洲影院色无极综合| 欧美日韩xxxxx| 国外视频精品毛片| 亚洲国产精品成人av| 国产精品日韩电影| 日韩av一卡二卡| 亚洲国产精品美女| 中文字幕9999| 久久久av亚洲男天堂| 亚洲网站在线看| 亚洲视频在线免费看| 国产日韩在线看| 九九热最新视频//这里只有精品| 欧美日韩国产综合视频在线观看中文| 欧洲中文字幕国产精品| 国产精品高精视频免费| 久久精品一偷一偷国产| 欧美最猛黑人xxxx黑人猛叫黄| 欧美视频二区36p| 亚洲区bt下载| 国产欧美一区二区| 日本一区二区三区四区视频| 欧洲成人在线观看| 亚洲精品国产免费| 亚洲伊人久久大香线蕉av| 在线成人激情视频| 黑人狂躁日本妞一区二区三区| 欧洲成人免费视频| 精品一区二区亚洲| 久久亚洲精品成人| 欧美日韩国产精品一区二区三区四区| 久久99热精品| 中文字幕精品久久久久| 国产精品久久久久久久天堂| 国产视频一区在线| 国产精国产精品| 中文欧美在线视频| 成人女保姆的销魂服务| 久久天天躁狠狠躁夜夜av| 日韩视频在线观看免费| 国产精品亚洲自拍| 亚洲精品欧美日韩专区| 国产精品午夜一区二区欲梦| 欧美性猛交丰臀xxxxx网站| 久久成人18免费网站| 亚洲肉体裸体xxxx137| 欧美性视频在线| 亚洲风情亚aⅴ在线发布| 日韩欧美中文字幕在线观看| 久久精品国产一区二区三区| 日韩视频在线观看免费| 色系列之999| 国产色婷婷国产综合在线理论片a| 欧美黑人巨大xxx极品| 欧美国产中文字幕| 高清在线视频日韩欧美| 精品久久久久久电影| 午夜精品久久久久久久白皮肤| 色综合久久88色综合天天看泰| 日韩av在线资源| 2018日韩中文字幕| 欧美视频裸体精品| 在线视频日本亚洲性| 深夜精品寂寞黄网站在线观看| 国产精品欧美日韩久久| 欧美一级淫片videoshd| 久久久女女女女999久久| 国产欧美一区二区三区视频| 91产国在线观看动作片喷水| 福利一区福利二区微拍刺激| 亚洲最大的成人网| 日韩经典第一页| 庆余年2免费日韩剧观看大牛| 欧美高清自拍一区| 国产精品午夜国产小视频| 欧美专区在线视频| 亚洲第一精品自拍| 欧美激情三级免费| 日韩美女视频在线观看| 国产精品久久久久久亚洲调教| 亚洲成人av片| 亚洲尤物视频网| 亚洲第一网站免费视频| 黑人精品xxx一区| 欧美日韩国产页| 丝袜情趣国产精品| 亚洲一级一级97网| 国产精品永久在线| 国产亚洲视频中文字幕视频| 欧美激情第99页| 久久婷婷国产麻豆91天堂| 日韩美女在线看| 精品香蕉在线观看视频一| 欧美激情免费看| 一区二区三区天堂av| 国产日韩亚洲欧美| 欧美日韩福利在线观看| 欧美日韩免费区域视频在线观看| 91精品国产自产在线| 欧美激情一二区| 久久精品国产96久久久香蕉| 91av国产在线| 欧美成人免费va影院高清| 91久久国产综合久久91精品网站| 日韩中文字幕免费视频| 日本精品久久电影| 欧美激情一区二区三区久久久| 久久久人成影片一区二区三区观看| 一本色道久久88精品综合| 国产一区香蕉久久| 一本色道久久综合狠狠躁篇怎么玩| 久久香蕉国产线看观看av| 国产成人在线精品| 亚洲男人第一av网站| 国产精品专区一| 欧美精品久久一区二区| 国产欧美亚洲视频| 欧美性视频精品| 国产一区二区三区三区在线观看| 国产精品永久免费在线| 亚洲另类图片色| 欧美放荡办公室videos4k| 国产精品男人爽免费视频1| 91久久久久久久一区二区| 国产精品成av人在线视午夜片| 亚洲人成在线免费观看| 精品久久久中文| 日韩经典中文字幕在线观看| 浅井舞香一区二区| 欧美激情免费在线| 日本成人在线视频网址| 亚洲精品日韩久久久| 国产精品免费视频xxxx| 在线日韩av观看| 亚洲欧美精品一区| 一区二区三区视频在线| 欧美日韩在线看| 亚洲人成在线一二| 久久久99免费视频| 国产精品一区二区三区久久| 久色乳综合思思在线视频| 午夜精品久久17c| 91精品中国老女人| 国产区精品在线观看| 久久综合色影院| 91av在线影院| 欧美在线视频网| 亚洲国产精品人久久电影| 深夜福利亚洲导航| 91青草视频久久| 久久婷婷国产麻豆91天堂| 欧洲亚洲在线视频| 免费91麻豆精品国产自产在线观看| 中文字幕一精品亚洲无线一区| 色综合亚洲精品激情狠狠| 亚洲成色999久久网站| 中文综合在线观看| 热99精品只有里视频精品| 欧美乱人伦中文字幕在线|