日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

JavaScript常見(jiàn)面試題四

 好程序員IT 2019-10-28

  JavaScript常見(jiàn)面試題四1、下面的代碼將輸出什么到控制臺(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)?1,然后當(dāng)應(yīng)用 - 時(shí)又變?yōu)榱?-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。

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

var list = readHugeList();var nextListItem = function() { var item = list.pop(); if (item) { // process the list item...

nextListItem();

}

};

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

var list = readHugeList();var nextListItem = function() { var item = list.pop(); if (item) { // process the list item...

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)。

3、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)單的例子:

var globalVar = "xyz";

(function outerFunc(outerArg) { var outerVar = 'a';

(function innerFunc(innerArg) { var innerVar = '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

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

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

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

}

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

上面的代碼不會(huì)按預(yù)期顯示值0,1,2,3,和4,而是會(huì)顯示5,55,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 (var i = 0; i < 5; i++) {

(function(x) {

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

})(i);

}

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

    本站是提供個(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)似文章 更多