久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Java教程分享JavaScript面試問(wèn)題及答案(二)

 好程序員IT 2019-06-27

Java教程分享JavaScript面試問(wèn)題及答案(二)

  1.寫(xiě)一個(gè)簡(jiǎn)單的函數(shù)(少于80個(gè)字符),,要求返回一個(gè)布爾值指明字符串是否為回文結(jié)構(gòu)。

  下面這個(gè)函數(shù)在str是回文結(jié)構(gòu)的時(shí)候返回true,,否則,,返回false

  functionisPalindrome(str){

  str=str.replace(/\W/g,'').toLowerCase();return(str==str.split('').reverse().join(''));

  }

  例如:

  console.log(isPalindrome("level"));//logs'true'console.log(isPalindrome("levels"));//logs'false'console.log(isPalindrome("Acar,aman,amaraca"));//logs'true'

  2,、.寫(xiě)一個(gè)sum方法,,在使用下面任一語(yǔ)法調(diào)用時(shí),都可以正常工作,。

  console.log(sum(2,3));//Outputs5console.log(sum(2)(3));//Outputs5

  (至少)有兩種方法可以做到:

  方法1

  functionsum(x){if(arguments.length==2){returnarguments[0]+arguments[1];

  }else{returnfunction(y){returnx+y;};

  }

  }

  在JavaScript中,,函數(shù)可以提供到arguments對(duì)象的訪問(wèn),arguments對(duì)象提供傳遞到函數(shù)的實(shí)際參數(shù)的訪問(wèn)。這使我們能夠使用length屬性來(lái)確定在運(yùn)行時(shí)傳遞給函數(shù)的參數(shù)數(shù)量,。

  如果傳遞兩個(gè)參數(shù),,那么只需加在一起,并返回,。

  否則,,我們假設(shè)它被以sum(2)(3)這樣的形式調(diào)用,所以我們返回一個(gè)匿名函數(shù),,這個(gè)匿名函數(shù)合并了傳遞到sum()的參數(shù)和傳遞給匿名函數(shù)的參數(shù),。

  方法2

  functionsum(x,y){if(y!==undefined){returnx+y;

  }else{returnfunction(y){returnx+y;};

  }

  }

  當(dāng)調(diào)用一個(gè)函數(shù)的時(shí)候,JavaScript不要求參數(shù)的數(shù)目匹配函數(shù)定義中的參數(shù)數(shù)量,。如果傳遞的參數(shù)數(shù)量大于函數(shù)定義中參數(shù)數(shù)量,,那么多余參數(shù)將簡(jiǎn)單地被忽略。另一方面,,如果傳遞的參數(shù)數(shù)量小于函數(shù)定義中的參數(shù)數(shù)量,,那么缺少的參數(shù)在函數(shù)中被引用時(shí)將會(huì)給一個(gè)undefined值。所以,,在上面的例子中,,簡(jiǎn)單地檢查第2個(gè)參數(shù)是否未定義,就可以相應(yīng)地確定函數(shù)被調(diào)用以及進(jìn)行的方式,。

  3,、請(qǐng)看下面的代碼片段:

  for(vari=0;i<5;i++){varbtn=document.createElement('button');

  btn.appendChild(document.createTextNode('Button'+i));

  btn.addEventListener('click',function(){console.log(i);});document.body.appendChild(btn);

  }

  (a)當(dāng)用戶(hù)點(diǎn)擊“Button4”的時(shí)候會(huì)輸出什么到控制臺(tái),為什么?(b)提供一個(gè)或多個(gè)備用的可按預(yù)期工作的實(shí)現(xiàn)方案,。

  (a)無(wú)論用戶(hù)點(diǎn)擊什么按鈕,,數(shù)字5將總會(huì)輸出到控制臺(tái)。這是因?yàn)?,?dāng)onclick方法被調(diào)用(對(duì)于任何按鈕)的時(shí)候,,for循環(huán)已經(jīng)結(jié)束,變量i已經(jīng)獲得了5的值,。(面試者如果能夠談一談?dòng)嘘P(guān)如何執(zhí)行上下文,,可變對(duì)象,激活對(duì)象和內(nèi)部“范圍”屬性貢有助于閉包行為,,則可以加分),。

  (b)要讓代碼工作的關(guān)鍵是,通過(guò)傳遞到一個(gè)新創(chuàng)建的函數(shù)對(duì)象,,在每次傳遞通過(guò)for循環(huán)時(shí),,捕捉到i值。下面是三種可能實(shí)現(xiàn)的方法:

  for(vari=0;i<5;i++){varbtn=document.createElement('button');

  btn.appendChild(document.createTextNode('Button'+i));

  btn.addEventListener('click',(function(i){returnfunction(){console.log(i);};

  })(i));document.body.appendChild(btn);

  }

  或者,,你可以封裝全部調(diào)用到在新匿名函數(shù)中的btn.addEventListener

  for(vari=0;i<5;i++){varbtn=document.createElement('button');

  btn.appendChild(document.createTextNode('Button'+i));

  (function(i){

  btn.addEventListener('click',function(){console.log(i);});

  })(i);document.body.appendChild(btn);

  }

  也可以調(diào)用數(shù)組對(duì)象的本地forEach方法來(lái)替代for循環(huán):

  ['a','b','c','d','e'].forEach(function(value,i){varbtn=document.createElement('button');

  btn.appendChild(document.createTextNode('Button'+i));

  btn.addEventListener('click',function(){console.log(i);});document.body.appendChild(btn);

  });

  4,、下面的代碼將輸出什么到控制臺(tái),為什么?

  vararr1="john".split('');vararr2=arr1.reverse();vararr3="jones".split('');

  arr2.push(arr3);console.log("array1:length="+arr1.length+"last="+arr1.slice(-1));console.log("array2:length="+arr2.length+"last="+arr2.slice(-1));

  輸出結(jié)果是:

  "array1:length=5last=j,o,n,e,s""array2:length=5last=j,o,n,e,s"

  arr1arr2在上述代碼執(zhí)行之后,兩者相同了,,原因是:

  調(diào)用數(shù)組對(duì)象的reverse()方法并不只返回反順序的陣列,,它也反轉(zhuǎn)了數(shù)組本身的順序(即,在這種情況下,,指的是arr1),。

  reverse()方法返回一個(gè)到數(shù)組本身的引用(在這種情況下即,arr1),。其結(jié)果為,,arr2僅僅是一個(gè)到arr1的引用(而不是副本)。因此,,當(dāng)對(duì)arr2做了任何事情(即當(dāng)我們調(diào)用arr2.push(arr3);)時(shí),,arr1也會(huì)受到影響,因?yàn)?/span>arr1arr2引用的是同一個(gè)對(duì)象,。

  這里有幾個(gè)側(cè)面點(diǎn)有時(shí)候會(huì)讓你在回答這個(gè)問(wèn)題時(shí),,陰溝里翻船:

  傳遞數(shù)組到另一個(gè)數(shù)組的push()方法會(huì)讓整個(gè)數(shù)組作為單個(gè)元素映射到數(shù)組的末端,。其結(jié)果是,,語(yǔ)句arr2.push(arr3);在其整體中添加arr3作為一個(gè)單一的元素到arr2的末端(也就是說(shuō),,它并沒(méi)有連接兩個(gè)數(shù)組,連接數(shù)組是concat()方法的目的),。

  和Python一樣,,JavaScript標(biāo)榜數(shù)組方法調(diào)用中的負(fù)數(shù)下標(biāo),例如slice()可作為引用數(shù)組末尾元素的方法:例如,,-1下標(biāo)表示數(shù)組中的最后一個(gè)元素,,等等。

  5,、下面的代碼將輸出什么到控制臺(tái),,為什么?

  console.log(1+"2"+"2");console.log(1++"2"+"2");console.log(1+-"1"+"2");console.log(+"1"+"1"+"2");console.log("A"-"B"+"2");console.log("A"-"B"+2);

  上面的代碼將輸出以下內(nèi)容到控制臺(tái):

  "122""32""02""112""NaN2"NaN

  原因是

  這里的根本問(wèn)題是,JavaScript(ECMAScript)是一種弱類(lèi)型語(yǔ)言,,它可對(duì)值進(jìn)行自動(dòng)類(lèi)型轉(zhuǎn)換,,以適應(yīng)正在執(zhí)行的操作。讓我們通過(guò)上面的例子來(lái)說(shuō)明這是如何做到的,。

  例11+"2"+"2"輸出:"122"說(shuō)明:1+"2"是執(zhí)行的第一個(gè)操作,。由于其中一個(gè)運(yùn)算對(duì)象("2")是字符串,JavaScript會(huì)假設(shè)它需要執(zhí)行字符串連接,,因此,會(huì)將1的類(lèi)型轉(zhuǎn)換為"1",,1+"2"結(jié)果就是"12",。然后,"12"+"2"就是"122"

  例21++"2"+"2"輸出:"32"說(shuō)明:根據(jù)運(yùn)算的順序,,要執(zhí)行的第一個(gè)運(yùn)算是+"2"(第一個(gè)"2"前面的額外+被視為一元運(yùn)算符),。因此,JavaScript"2"的類(lèi)型轉(zhuǎn)換為數(shù)字,,然后應(yīng)用一元+號(hào)(即,,將其視為一個(gè)正數(shù))。其結(jié)果是,,接下來(lái)的運(yùn)算就是1+2,,這當(dāng)然是3。然后我們需要在一個(gè)數(shù)字和一個(gè)字符串之間進(jìn)行運(yùn)算(即,,3"2"),,同樣的,JavaScript會(huì)將數(shù)值類(lèi)型轉(zhuǎn)換為字符串,,并執(zhí)行字符串的連接,,產(chǎn)生"32"

  例31+-"1"+"2"輸出:"02"說(shuō)明:這里的解釋和前一個(gè)例子相同,,除了此處的一元運(yùn)算符是-而不是+,。先是"1"變?yōu)?/span>1,然后當(dāng)應(yīng)用-時(shí)又變?yōu)榱?/span>-1,,然后將其與1相加,,結(jié)果為0,再將其轉(zhuǎn)換為字符串,,連接后的"2"運(yùn)算對(duì)象,,得到"02"

  例4+"1"+"1"+"2"輸出:"112"說(shuō)明:雖然第一個(gè)運(yùn)算對(duì)象"1"因?yàn)榍熬Y的一元+運(yùn)算符類(lèi)型轉(zhuǎn)換為數(shù)值,,但又立即轉(zhuǎn)換回字符串,,當(dāng)連接到第二個(gè)運(yùn)算對(duì)象"1"的時(shí)候,然后又和最后的運(yùn)算對(duì)象"2"連接,,產(chǎn)生了字符串"112",。

  例5"A"-"B"+"2"輸出:"NaN2"說(shuō)明:由于運(yùn)算符-不能被應(yīng)用于字符串,并且"A""B"都不能轉(zhuǎn)換成數(shù)值,,因此,,"A"-"B"的結(jié)果是NaN,然后再和字符串"2"連接,,得到"NaN2",。

  例6"A"-"B"+2輸出:NaN說(shuō)明:參見(jiàn)前一個(gè)例子,"A"-"B"結(jié)果為NaN,。但是,,應(yīng)用任何運(yùn)算符到NaN與其他任何的數(shù)字運(yùn)算對(duì)象,,結(jié)果仍然是NaN

  6,、下面的遞歸代碼在數(shù)組列表偏大的情況下會(huì)導(dǎo)致堆棧溢出,。在保留遞歸模式的基礎(chǔ)上,你怎么解決這個(gè)問(wèn)題?

  varlist=readHugeList();varnextListItem=function(){varitem=list.pop();if(item){//processthelistitem...

  nextListItem();

  }

  };

  潛在的堆棧溢出可以通過(guò)修改nextListItem函數(shù)避免:

  varlist=readHugeList();varnextListItem=function(){varitem=list.pop();if(item){//processthelistitem...

  setTimeout(nextListItem,0);

  }

  };

  堆棧溢出之所以會(huì)被消除,,是因?yàn)槭录h(huán)操縱了遞歸,,而不是調(diào)用堆棧。當(dāng)nextListItem運(yùn)行時(shí),,如果item不為空,,timeout函數(shù)(nextListItem)就會(huì)被推到事件隊(duì)列,該函數(shù)退出,,因此就清空調(diào)用堆棧,。當(dāng)事件隊(duì)列運(yùn)行其timeout事件,且進(jìn)行到下一個(gè)item時(shí),,定時(shí)器被設(shè)置為再次調(diào)用extListItem,。因此,該方法從頭到尾都沒(méi)有直接的遞歸調(diào)用,,所以無(wú)論迭代次數(shù)的多少,,調(diào)用堆棧保持清空的狀態(tài)。

  7,、JavaScript中的“閉包”是什么?請(qǐng)舉一個(gè)例子,。

  閉包是一個(gè)可以訪問(wèn)外部(封閉)函數(shù)作用域鏈中的變量的內(nèi)部函數(shù)。閉包可以訪問(wèn)三種范圍中的變量:這三個(gè)范圍具體為:(1)自己范圍內(nèi)的變量,,(2)封閉函數(shù)范圍內(nèi)的變量,,以及(3)全局變量。

  下面是一個(gè)簡(jiǎn)單的例子:

  varglobalVar="xyz";

  (functionouterFunc(outerArg){varouterVar='a';

  (functioninnerFunc(innerArg){varinnerVar='b';console.log("outerArg="+outerArg+"\n"+"innerArg="+innerArg+"\n"+"outerVar="+outerVar+"\n"+"innerVar="+innerVar+"\n"+"globalVar="+globalVar);

  })(456);

  })(123);

  在上面的例子中,,來(lái)自于innerFunc,,outerFunc和全局命名空間的變量都在innerFunc的范圍內(nèi)。因此,,上面的代碼將輸出如下:

  outerArg=123innerArg=456outerVar=ainnerVar=bglobalVar=xyz

  8,、下面的代碼將輸出什么:

  for(vari=0;i<5;i++){

  setTimeout(function(){console.log(i);},i*1000);

  }

  解釋你的答案。閉包在這里能起什么作用?

  上面的代碼不會(huì)按預(yù)期顯示值0,,1,,23,,和4,,而是會(huì)顯示55,,5,,5,,和5

  原因是,,在循環(huán)中執(zhí)行的每個(gè)函數(shù)將整個(gè)循環(huán)完成之后被執(zhí)行,因此,,將會(huì)引用存儲(chǔ)在i中的最后一個(gè)值,,那就是5

  閉包可以通過(guò)為每次迭代創(chuàng)建一個(gè)唯一的范圍,,存儲(chǔ)范圍內(nèi)變量的每個(gè)唯一的值,,來(lái)防止這個(gè)問(wèn)題,如下:

  for(vari=0;i<5;i++){

  (function(x){

  setTimeout(function(){console.log(x);},x*1000);

  })(i);

  }

  這就會(huì)按預(yù)期輸出0,,1,,23,,和4到控制臺(tái),。

  9以下代碼行將輸出什么到控制臺(tái)?

  console.log("0||1="+(0||1));console.log("1||2="+(1||2));console.log("0&&1="+(0&&1));console.log("1&&2="+(1&&2));

  并解釋,。

  該代碼將輸出:

  0||1=11||2=10&&1=01&&2=2

  在JavaScript中,,||&&都是邏輯運(yùn)算符,用于在從左至右計(jì)算時(shí),,返回第一個(gè)可完全確定的“邏輯值”,。

  或(||)運(yùn)算符。在形如X||Y的表達(dá)式中,,首先計(jì)算X并將其解釋執(zhí)行為一個(gè)布爾值,。如果這個(gè)布爾值true,那么返回true(1),,不再計(jì)算Y,,因?yàn)椤盎颉钡臈l件已經(jīng)滿(mǎn)足。如果這個(gè)布爾值為false,,那么我們?nèi)匀徊荒苤?/span>X||Y是真是假,,直到我們計(jì)算Y,并且也把它解釋執(zhí)行為一個(gè)布爾值,。

  因此,,0||1的計(jì)算結(jié)果為true(1),同理計(jì)算1||2,。

  與(&&)運(yùn)算符,。在形如X&&Y的表達(dá)式中,首先計(jì)算X并將其解釋執(zhí)行為一個(gè)布爾值,。如果這個(gè)布爾值為false,,那么返回false(0),,不再計(jì)算Y,因?yàn)椤芭c”的條件已經(jīng)失敗,。如果這個(gè)布爾值為true,,但是,我們?nèi)匀徊恢?/span>X&&Y是真是假,,直到我們?nèi)ビ?jì)算Y,,并且也把它解釋執(zhí)行為一個(gè)布爾值。

  不過(guò),,關(guān)于&&運(yùn)算符有趣的地方在于,,當(dāng)一個(gè)表達(dá)式計(jì)算為“true”的時(shí)候,那么就返回表達(dá)式本身,。這很好,,雖然它在邏輯表達(dá)式方面計(jì)算為“真”,但如果你希望的話也可用于返回該值,。這就解釋了為什么,,有些令人奇怪的是,1&&2返回2(而不是你以為的可能返回true1),。

  10,、執(zhí)行下面的代碼時(shí)將輸出什么?請(qǐng)解釋。

  console.log(false=='0')console.log(false==='0')

  代碼將輸出:

  truefalse

  在JavaScript中,,有兩種等式運(yùn)算符,。三個(gè)等于運(yùn)算符===的作用類(lèi)似傳統(tǒng)的等于運(yùn)算符:如果兩側(cè)的表達(dá)式有著相同的類(lèi)型和相同的值,那么計(jì)算結(jié)果為true,。而雙等于運(yùn)算符,,會(huì)只強(qiáng)制比較它們的值。因此,,總體上而言,,使用===而不是==的做法更好。!==vs!=亦是同理,。

  21.以下代碼將輸出什么?并解釋你的答案,。

  vara={},

  b={key:'b'},c={key:'c'};

  a[b]=123;

  a[c]=456;

  console.log(a[b]);

  這段代碼將輸出456(而不是123)

  原因?yàn)椋寒?dāng)設(shè)置對(duì)象屬性時(shí),,JavaScript會(huì)暗中字符串化參數(shù)值,。在這種情況下,由于bc都是對(duì)象,,因此它們都將被轉(zhuǎn)換為"[objectObject]",。結(jié)果就是,a[b]a[c]均相當(dāng)于a["[objectObject]"],,并可以互換使用,。因此,,設(shè)置或引用a[c]和設(shè)置或引用a[b]完全相同。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多