日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

几道比较有意思的js面试题

發(fā)布時(shí)間:2023/12/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 几道比较有意思的js面试题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、[] ? !![] : ![];輸出結(jié)果是什么?

1 2 3 4 5 let?val?=?[]???!![]?:?![]; console.log(val);? //true: //之前的錯(cuò)誤解釋:[]?是一個(gè)null,做判斷則為false,false執(zhí)行![]語(yǔ)句,結(jié)果為非空,即true //更正:[]是一個(gè)object,object判斷為true(null實(shí)際上也是一個(gè)object不過(guò)比較特殊是6種false之一),true執(zhí)行?!![]?兩次取反為true.多謝@此生只為你傾心指正。

這里順便說(shuō)明一下,js用于做判斷,只有以下6種情況判斷出來(lái)的值為false:

值為false:????false????0????null????""(空字符串)????undefined????NaN? ?

其他均為true。

延展一下,有個(gè)比較有意思的情況是:[] == ![]; //true,

還有[]我們剛剛判斷為true對(duì)吧? 但是呢 [] == false;? //true,

為什么呢?

==?:趨向于先轉(zhuǎn)換成0和1再做判斷,一起來(lái)看看吧

????? ? 先看[] == false首先把比較的雙方轉(zhuǎn)成number(雙方有一方是布爾值),[]是空數(shù)組,轉(zhuǎn)換成基本類型為"",空所以被轉(zhuǎn)化為0,false也被轉(zhuǎn)成0。0 == 0,true(不過(guò)如果用恒等于 ===則為false,因?yàn)閮烧邤?shù)據(jù)類型不一致,[]為object(里的array),false為布爾值)

????????再看[] == ![]; []是object即true,!true ==> false;? false ==> 0; 而[]我們知道最終轉(zhuǎn)化為0,所以 0 == 0; //true;

????????[] == [] 實(shí)際上是false哈。是不是很別扭?

所以:慎用 "==",用“===”

2、下面代碼輸出什么?

1 2 3 4 let?k; for(let?i?=?0,j?=?0;i?<?10,j?<?8;?i++,?j++){ ??k?=?i?+?j; }

????????答案是:14。這里的i和j是同步增長(zhǎng),當(dāng)j加到7的時(shí)候,i也等于7,k執(zhí)行等于14,j再加1,不滿足條件,跳出循環(huán),結(jié)果為14,如果再問(wèn)i和j的值,則都為8。

3、有這樣一串雜亂無(wú)章的數(shù)據(jù)————dahsidoai 213907;a? poas198jdo 213089 as13d115。

? ? ? 我希望它輸出["213907", "198", "213089", "13", "115"],請(qǐng)寫(xiě)出實(shí)現(xiàn)過(guò)程

1 2 3 4 5 6 7 8 9 10 11 12 let?str?=?"dahsidoai?213907;a??poas198jdo?213089?as13d115"; function?searchNumUnit(str){ ??let?arr?=?[], ?????str0?=?str,?//不影響原數(shù)據(jù) ?????reg?=?/\d+/; ??while(reg.test(str0)){ ????arr.push(reg.exec(str0)[0]); ????str0?=?str0.split('').slice(reg.exec(str0).index?+?reg.exec(str0)[0].length,str0.length).join(''); ??} ??return?arr; } console.log(searchNumUnit(str));

第2種方法,利用js的match函數(shù)提取字符串:

1 2 let?str?=?"dahsidoai?213907;a??poas198jdo?213089?as13d115"; console.log(str.match(/\d+/g));//感謝慕姐704907

4、下面是一道綜合題,問(wèn)題會(huì)由淺及深一步步問(wèn),你需要一步步解決:

????????下面的程序輸出什么?假如說(shuō)我用"==>"表示程序延遲了多久輸出,比如1,2 ==> 3 ,表示12同時(shí)輸出,之后間隔1000ms(為避免鉆牛角尖,這里的1000只是一個(gè)大概數(shù))輸出了3

1 2 3 4 5 6 for(var?i?=?0;?i?<?6;?i?++){ ??setTimeout(function(){ ????console.log(i); ??},1000); } //?輸出結(jié)果:6,6,6,6,6,6

那我如果想輸出0 , 1 , 2 , 3 , 4 , 5呢?得怎么寫(xiě)?能否通過(guò)多種方式來(lái)寫(xiě)出?(最少2種)

1 2 3 4 5 6 7 8 //第1種方式: for(var?i?=?0;?i?<?6;?i?++){ ??(function(j){ ????setTimeout(function(){ ??????console.log(j); ????},1000); ??})(i) }
1 2 3 4 5 6 7 //第2種方式: for(let?i?=?0;?i?<?6;?i?++){ ??setTimeout(function(){ ????console.log(i); ??},1000); } //輸出結(jié)果:0?,?1?,?2?,?3?,?4?,?5

那我如果是想輸出0 ==> 1 ==> 2 ==> 3 ==> 4 ==> 5程序得怎么改變?

1 2 3 4 5 6 7 8 //?代碼如下: for(var?i?=?0;?i?<?6;?i?++){ ??(function(j){ ????setTimeout(function(){ ??????console.log(j); ????},1000?*?j); ??})(i) }

???????上面這種代碼能實(shí)現(xiàn)邏輯,但代碼太爛,沒(méi)法給你加分,有沒(méi)有更好的辦法?另外我為什么說(shuō)你的代碼太爛?能順便說(shuō)明一下嗎?

1 2 3 4 5 6 7 //首先我的代碼太爛是因?yàn)槲覄?chuàng)建了太多的定時(shí)器,僅僅這里我就創(chuàng)建了6個(gè)定時(shí)器,如果i值非常大,會(huì)非常消耗資源,大大降低執(zhí)行性能 //優(yōu)化代碼如下:這里的好處是即使你的i1值達(dá)到10000甚至1億,我始終只有1個(gè)定時(shí)器。 let?i1?=?0; let?time?=?setInterval(output_i1,1000); function?output_i1(){ ??i1?<?6???console.log("i1="?+?i1++)?:?clearInterval(time); }

????????這樣算可以給你加5分,如果我不是0 , 1 , 2 , 3 , 4 , 5呢?而是0,1,2,3,4,5...簡(jiǎn)單的說(shuō)能否給我自定義?

這個(gè)簡(jiǎn)單啊,改成這樣不就可以了?

1 2 3 4 5 let?i1?=?0; let?time?=?setInterval(output(6),1000); function?output(num){ ??i1?<?num-1???console.log(++i1)?:?clearInterval(time); }

????????可惜你這個(gè)函數(shù)是錯(cuò)的,setInterval接收的是一個(gè)function:output,而不是接收一個(gè)已經(jīng)運(yùn)行的output(),所以呢?你得怎么改?

1 2 3 4 5 6 7 8 9 10 11 //改成這樣: let?i2?=?0; let?time1?=?setInterval(_output_i2(8),1000); function?_output_i2(num){ ??return?function(){ ????output_i2(num); ??} } function?output_i2(num){ ??i2?<?num???console.log("i2="+?i2++)?:?clearInterval(time1); }

????????如果你到了這一步,嗯,還行,勉強(qiáng)達(dá)到了基本要求,但是呢,其實(shí)這里涉及到異步,用promise又得怎么寫(xiě)?還能再進(jìn)一步嗎?答案是肯定的,不過(guò)呢,先答下一題吧。

?

5、這是一道簡(jiǎn)單的數(shù)據(jù)處理題

一個(gè)樹(shù)形json數(shù)據(jù)有3層,基本的結(jié)構(gòu)如下:(...代表后續(xù)有若干個(gè)類似的對(duì)象)

數(shù)據(jù)大概是這樣:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [ ??{ ????id?:?"1", ????name?:?"dorsey1", ????children:?[ ??????{ ????????id?:?"1-1", ????????name?:?"dorsey1-1", ????????children?:?[ ??????????{ ????????????id?:?"1-1-1", ????????????name?:?"dorsey1-1-1", ????????????children?:?[ ??????????????{ ????????????????id?:?"1-1-1-1", ????????????????name?:?"dorsey1-1-1-1", ??????????????} ?????????????... ????????????] ??????????} ????????... ????????] ??????} ?????... ????] ??} ?... ]

請(qǐng)寫(xiě)一個(gè)函數(shù)傳入id值返回name值,另外呢?這里雖說(shuō)只是3層,能否拓展到若干層?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 let?data?=?[ ??{ ??id?:?"1", ??name?:?"dorsey1", ??children:?[ ????{ ??????id?:?"1-1", ??????name?:?"dorsey1-1", ??????children?:?[ ????????{ ??????????id?:?"1-1-1", ??????????name?:?"dorsey1-1-1", ??????????children?:?[ ????????????{ ??????????????id?:?"1-1-1-1", ??????????????name?:?"dorsey1-1-1-1", ????????????} ??????????] ????????}, ????????{ ??????????id?:?"1-1-2", ??????????name?:?"dorsey1-1-2" ????????} ??????] ????}, ????{ ??????id?:?"1-2", ??????name?:?"dorsey1-2", ??????children?:?[ ????????{ ??????????id?:?"1-2-1", ??????????name?:?"dorsey1-2-1" ????????}, ????????{ ??????????id?:?"1-2-2", ??????????name?:?"dorsey1-2-2" ????????} ??????] ????}, ????{ ??????id?:?"1-3", ??????name?:?"dorsey1-3", ??????children?:?[ ????????{ ??????????id?:?"1-3-1", ??????????name?:?"dorsey1-3-1" ????????}, ????????{ ??????????id?:?"1-3-2", ??????????name?:?"dorsey1-3-2" ????????} ??????] ????} ????] ??}, ??{ ????id?:?"2", ????name?:?"dorsey2", ????children:?[ ??????{ ????????id?:?"2-1", ????????name?:?"dorsey2-1", ????????children?:?[ ??????????{ ????????????id?:?"2-1-1", ????????????name?:?"dorsey2-1-1" ??????????}, ??????????{ ????????????id?:?"2-1-2", ????????????name?:?"dorsey2-1-2" ??????????} ????????] ??????}, ??????{ ????????id?:?"2-2", ????????name?:?"dorsey2-2", ????????children?:?[ ??????????{ ????????????id?:?"2-2-1", ????????????name?:?"dorsey2-2-1" ??????????}, ??????????{ ????????????id?:?"2-2-2", ????????????name?:?"dorsey2-2-2" ??????????} ????????] ??????} ????] ??} ]

這是基本的json解析,請(qǐng)看下面的實(shí)現(xiàn):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 //最原始的實(shí)現(xiàn)如下: function?getJsonDataNameById(dataArr,id)?{ ??let?agent?=?[]; ??let?data?=?dataArr, ??len?=?data.length; ??for?(let?i?=?0;?i?<?len;?i++)?{ ????let?item?=?data[i]; ????if(item.children?&&?item.children.length?!==?0){ ??????for(let?j?=?0?;?j?<?item.children.length;?j?++){ ????????agent.push(item.children[j]); ??????} ??????data?=?data.concat(agent);?//children降維 ??????len?+=?agent.length; ??????agent?=?[]; ????} ??} ??for(let?i?=?0;?i?<?data.length;?i++){ ????if(data[i].id?===?id){ ??????return?data[i].name; ????} ??} } let?a?=?getJsonDataNameById(data,?"1-3-2"); console.log(a);


作者:dorseyCh
鏈接:https://www.imooc.com/article/48993
來(lái)源:慕課網(wǎng)
本文原創(chuàng)發(fā)布于慕課網(wǎng) ,轉(zhuǎn)載請(qǐng)注明出處,謝謝合作

轉(zhuǎn)載于:https://www.cnblogs.com/justBobo/p/10740542.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的几道比较有意思的js面试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。