面試題

http://www.css88.com/archives/7052#more-7052
1 作用域

Paste_Image.png

a=> undefined
b=>5

Paste_Image.png

b 報(bào)錯(cuò) 在函數(shù)中使用”嚴(yán)格模式”那么代碼就會(huì)報(bào)錯(cuò) (Uncaught ReferenceError: b is not defined” )請(qǐng)記住,如果這是預(yù)期的行為,嚴(yán)格模式要求你顯式地引用全局作用域。所以,你需要像下面這么寫:

Paste_Image.png

關(guān)于call和apply

function printing() {
   console.log(1);
   setTimeout(function() { console.log(2); }, 1000);
   setTimeout(function() { console.log(3); }, 0);
   console.log(4);
}
printing();
Paste_Image.png

想知道為什么輸出順序是這樣的,你需要弄了解setTimeout()做了什么,以及瀏覽器的事件循環(huán)原理。瀏覽器有一個(gè)事件循環(huán)用于檢查事件隊(duì)列,處理延遲的事件。UI事件(例如,點(diǎn)擊,滾動(dòng)等),Ajax回調(diào),以及提供給setTimeout()和setInterval()的回調(diào)都會(huì)依次被事件循環(huán)處理。因此,當(dāng)調(diào)用setTimeout()函數(shù)時(shí),即使延遲的時(shí)間被設(shè)置為0,提供的回調(diào)也會(huì)被排隊(duì)。回調(diào)會(huì)呆在隊(duì)列中,直到指定的時(shí)間用完后,引擎開始執(zhí)行動(dòng)作(如果它在當(dāng)前不執(zhí)行其他的動(dòng)作)。因此,即使setTimeout()回調(diào)被延遲0毫秒,它仍然會(huì)被排隊(duì),并且直到函數(shù)中其他非延遲的語句被執(zhí)行完了之后,才會(huì)執(zhí)行。

有了這些認(rèn)識(shí),理解輸出結(jié)果為“1”就容易了,因?yàn)樗呛瘮?shù)的第一句并且沒有使用setTimeout()函數(shù)來延遲。接著輸出“4”,因?yàn)樗菦]有被延遲的數(shù)字,也沒有進(jìn)行排隊(duì)。然后,剩下了“2”,“3”,兩者都被排隊(duì),但是前者需要等待一秒,后者等待0秒(這意味著引擎完成前兩個(gè)輸出之后馬上進(jìn)行)。這就解釋了為什么“3”在“2”之前。

問題10:算法

寫一個(gè)isPrime()函數(shù),當(dāng)其為質(zhì)數(shù)時(shí)返回true,否則返回false。
我認(rèn)為這是面試中最常見的問題之一。然而,盡管這個(gè)問題經(jīng)常出現(xiàn)并且也很簡(jiǎn)單,但是從被面試人提供的答案中能很好地看出被面試人的數(shù)學(xué)和算法水平。
首先, 因?yàn)镴avaScript不同于C或者Java,因此你不能信任傳遞來的數(shù)據(jù)類型。如果面試官?zèng)]有明確地告訴你,你應(yīng)該詢問他是否需要做輸入檢查,還是不進(jìn)行檢查直接寫函數(shù)。嚴(yán)格上說,應(yīng)該對(duì)函數(shù)的輸入進(jìn)行檢查。
第二點(diǎn)要記?。贺?fù)數(shù)不是質(zhì)數(shù)。同樣的,1和0也不是,因此,首先測(cè)試這些數(shù)字。此外,2是質(zhì)數(shù)中唯一的偶數(shù)。沒有必要用一個(gè)循環(huán)來驗(yàn)證4,6,8。再則,如果一個(gè)數(shù)字不能被2整除,那么它不能被4,6,8等整除。因此,你的循環(huán)必須跳過這些數(shù)字。如果你測(cè)試輸入偶數(shù),你的算法將慢2倍(你測(cè)試雙倍數(shù)字)??梢圆扇∑渌恍└髦堑膬?yōu)化手段,我這里采用的是適用于大多數(shù)情況的。例如,如果一個(gè)數(shù)字不能被5整除,它也不會(huì)被5的倍數(shù)整除。所以,沒有必要檢測(cè)10,15,20等等。如果你深入了解這個(gè)問題的解決方案,我建議你去看相關(guān)的Wikipedia介紹。
最后一點(diǎn),你不需要檢查比輸入數(shù)字的開方還要大的數(shù)字。我感覺人們會(huì)遺漏掉這一點(diǎn),并且也不會(huì)因?yàn)榇硕@得消極的反饋。但是,展示出這一方面的知識(shí)會(huì)給你額外加分。
現(xiàn)在你具備了這個(gè)問題的背景知識(shí),下面是總結(jié)以上所有考慮的解決方案:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容