欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

好程序員Java教程分享JavaScript常見面試題三

 好程序員Java教程分享JavaScript常見面試題三:1.下列代碼行1-4如何排序,使之能夠在執(zhí)行代碼時輸出到控制臺??為什么?

公司主營業(yè)務(wù):網(wǎng)站設(shè)計、做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出貴港免費做網(wǎng)站回饋大家。

 (function() { console.log(1);

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

 setTimeout(function(){console.log(3)}, 0);

 console.log(4);

 })();

 序號如下:

 1

 4

 3

 2

 讓我們先來解釋比較明顯而易見的那部分:

 1?和?4之所以放在前面,是因為它們是通過簡單調(diào)用?console.log()?而沒有任何延遲輸出的

 2?之所以放在?3的后面,是因為?2?是延遲了1000毫秒(即,1秒)之后輸出的,而?3?是延遲了0毫秒之后輸出的。

 好的。但是,既然?3?是0毫秒延遲之后輸出的,那么是否意味著它是立即輸出的呢?如果是的話,那么它是不是應(yīng)該在?4?之前輸出,既然?4?是在第二行輸出的?

 要回答這個問題,你需要正確理解JavaScript的事件和時間設(shè)置。

 瀏覽器有一個事件循環(huán),會檢查事件隊列和處理未完成的事件。例如,如果時間發(fā)生在后臺(例如,腳本的?onload?事件)時,瀏覽器正忙(例如,處理一個?onclick),那么事件會添加到隊列中。當(dāng)onclick處理程序完成后,檢查隊列,然后處理該事件(例如,執(zhí)行?onload?腳本)。

 同樣的,?setTimeout()?也會把其引用的函數(shù)的執(zhí)行放到事件隊列中,如果瀏覽器正忙的話。

 當(dāng)setTimeout()的第二個參數(shù)為0的時候,它的意思是“盡快”執(zhí)行指定的函數(shù)。具體而言,函數(shù)的執(zhí)行會放置在事件隊列的下一個計時器開始。但是請注意,這不是立即執(zhí)行:函數(shù)不會被執(zhí)行除非下一個計時器開始。這就是為什么在上述的例子中,調(diào)用?console.log(4)?發(fā)生在調(diào)用?console.log(3)?之前(因為調(diào)用?console.log(3)?是通過setTimeout被調(diào)用的,因此會稍微延遲)。

 

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

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

 function isPalindrome(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("A car, a man, a maraca")); // logs 'true'

 

 3.寫一個?sum方法,在使用下面任一語法調(diào)用時,都可以正常工作。

 console.log(sum(2,3)); // Outputs 5console.log(sum(2)(3)); // Outputs 5

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

 方法1

 function sum(x) { if (arguments.length == 2) { return arguments[0] + arguments[1];

 } else { return function(y) { return x + y; };

 }

 }

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

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

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

 方法2

 function sum(x, y) { if (y !== undefined) { return x + y;

 } else { return function(y) { return x + y; };

 }

 }

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

 

 4.請看下面的代碼片段:

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

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

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

 }

 (a)當(dāng)用戶點擊“Button 4”的時候會輸出什么到控制臺,為什么?(b)提供一個或多個備用的可按預(yù)期工作的實現(xiàn)方案。

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

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

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

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

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

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

 }

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

 for (var i = 0; i < 5; i++) { var btn = 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ù)組對象的本地?forEach?方法來替代?for?循環(huán):

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

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

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

 });

 

 5.下面的代碼將輸出什么到控制臺,為什么?

 var arr1 = "john".split('');var arr2 = arr1.reverse();var arr3 = "jones".split('');

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

 輸出結(jié)果是:

 "array 1: length=5 last=j,o,n,e,s""array 2: length=5 last=j,o,n,e,s"

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

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

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

 這里有幾個側(cè)面點有時候會讓你在回答這個問題時,陰溝里翻船:

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

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

?

?

網(wǎng)站標(biāo)題:好程序員Java教程分享JavaScript常見面試題三
分享鏈接:http://chinadenli.net/article26/jiehcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、做網(wǎng)站、品牌網(wǎng)站設(shè)計、云服務(wù)器、移動網(wǎng)站建設(shè)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名