中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-08 22:21:00 來源:網絡 閱讀:133 作者:wx5da18b5c4b01e 欄目:編程語言

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

  (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之所以放在前面,是因為它們是通過簡單調用?console.log()?而沒有任何延遲輸出的

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

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

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

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

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

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

  

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

  下面這個函數在?str?是回文結構的時候返回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方法,在使用下面任一語法調用時,都可以正常工作。

  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中,函數可以提供到?arguments?對象的訪問,arguments?對象提供傳遞到函數的實際參數的訪問。這使我們能夠使用?length?屬性來確定在運行時傳遞給函數的參數數量。

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

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

  方法2

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

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

  }

  }

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

  

  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)當用戶點擊“Button 4”的時候會輸出什么到控制臺,為什么?(b)提供一個或多個備用的可按預期工作的實現方案。

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

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

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

  }

  或者,你可以封裝全部調用到在新匿名函數中的?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);

  }

  也可以調用數組對象的本地?forEach?方法來替代?for?循環:

  ['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));

  輸出結果是:

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

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

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

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

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

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

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

?

?


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凤阳县| 庐江县| 涟水县| 承德县| 江都市| 云和县| 拉萨市| 华容县| 城市| 长武县| 绵竹市| 江阴市| 巴楚县| 南安市| 石渠县| 札达县| 长兴县| 安阳市| 南丹县| 钟祥市| 册亨县| 鄢陵县| 英德市| 嘉祥县| 商城县| 南昌县| 通州区| 呼图壁县| 龙陵县| 兴宁市| 承德市| 浏阳市| 肃宁县| 横峰县| 金秀| 上饶县| 思茅市| 农安县| 遂平县| 青铜峡市| 万载县|