400個最常見的 JavaScript 面試問答(2)

海擁科技 發佈 2022-08-06T17:28:51.924996+00:00

今天將給大家帶來的是 400 個最常見的 JavaScript 面試問答第二部分。例如,在這種語言中,一個函數可以作為參數傳遞給其他函數,可以由另一個函數返回,也可以作為一個值分配給一個變量。

大家好,我是海擁,專注於前端知識的分享。今天將給大家帶來的是 400 個最常見的 JavaScript 面試問答第二部分。接下來我會持續更新(爭取日更,也可能每周3-5篇),每小節大概 10 道題左右,總共會有 400 多道。


大家一定要記得點讚收藏呀!!!


11.什麼是頭等函數?

在 Javascript 中,函數是第一類對象。頭等函數意味著該語言中的函數被視為任何其他變量。

例如,在這種語言中,一個函數可以作為參數傳遞給其他函數,可以由另一個函數返回,也可以作為一個值分配給一個變量。例如,在下面的示例中,分配給偵聽器的處理函數

const handler = () => console.log ('This is a click handler Function');
document.addEventListener ('click', handler);

12.什麼是一階函數?

一階函數是不接受另一個函數作為參數並且不返回函數作為其返回值的函數。

const firstOrder = () => console.log ('I am a first order function!');

13.什麼是高階函數?

高階函數是接受另一個函數作為參數或返回一個函數作為返回值或兩者兼而有之的函數。

const firstOrderFunc = () => console.log ('Hello, I am a First order function');
const higherOrder = ReturnFirstOrderFunc => ReturnFirstOrderFunc();
higherOrder(firstOrderFunc);

14.什麼是一元函數?

一元函數(即 monadic)是一個只接受一個參數的函數。它代表一個函數接受的單個參數。

讓我們以一元函數為例,

const unaryFunction = a => console.log (a + 10); // 給給定的參數加 10

15.什麼是柯里化函數?

柯里化是將具有多個參數的函數轉換為每個只有一個參數的函數序列的過程。Currying 以數學家Haskell Curry 的名字命名。通過應用柯里化,n 元函數將其變成一元函數。

讓我們舉一個 n-ary 函數的例子,以及它如何變成一個柯里化函數,

const multiArgFunction = (a, b, c) => a + b + c;
console.log(multiArgFunction(1,2,3));// 6

const curryUnaryFunction = a => b => c => a + b + c;
curryUnaryFunction (1); // return a function: b => c =>  1 + b + c
curryUnaryFunction (1) (2); // return a function: c => 3 + c
curryUnaryFunction (1) (2) (3); // return 數字 6

Curried 函數對於提高代碼復用性函數組合非常有用。


16.什麼是純函數?

一個純函數是在返回值是由它的參數沒有任何副作用只有確定的函數。即如果您在應用程式中調用具有相同參數 『n』 次和 『n』 個位置的函數,則它將始終返回相同的值。

我們舉個例子來看看純函數和非純函數的區別,

//不純
let numberArray = [];
const impureAddnumber = number => numberArray.push(number);
//純
const pureAddNumber = number => argNumberArray =>
  argNumberArray.concat([number]);

//顯示結果
console.log (impureAddNumber(6)); // returns 1
console.log (numberArray); // returns [6]
console.log (pureAddNumber(7) (numberArray)); // returns [6, 7]
console.log (numberArray); // returns [6]

根據上面的代碼片段,通過改變數組並返回一個與參數值無關的推送數字索引,推送函數本身是不純的。而另一方面,Concat獲取數組並將其與另一個數組連接起來,產生一個沒有副作用的全新數組。此外,返回值是前一個數組的串聯。

請記住,純函數很重要,因為它們簡化了單元測試,沒有任何副作用,也不需要依賴注入。它們還避免了緊密耦合,並通過沒有任何副作用使您的應用程式更難中斷。這些原則通過優先使用const 而不是let與 ES6 的不變性概念結合在一起。


17.let 關鍵字的用途是什麼?

let語句聲明了一個塊作用域局部變量。因此,使用 let 關鍵字定義的變量的範圍僅限於使用它的塊、語句或表達式。而使用var關鍵字聲明的變量用於定義全局變量或局部變量,而不管塊作用域如何。

我們舉個例子來演示一下用法,

let counter = 30;
if (counter === 30) {
  let counter = 31;
  console.log(counter); // 31
}
console.log(counter); // 30 (因為這裡不存在 if 塊中的變量)

18.let 和 var 有什麼區別?

以表格格式列出差異

var

let

它從 JavaScript 開始就可用

作為 ES6 的一部分引入

它有函數作用域

它有塊作用域

變量將被提升

已提升但未初始化

讓我們舉個例子看看區別,


function userDetails(username) {
   if(username) {
     console.log(salary); // 由於變量提升未定義
     console.log(age); // 參考錯誤:初始化前無法訪問"age"
     let age = 30;
     var salary = 10000;
   }
   console.log(salary); //10000 (可訪問到適當的函數範圍)
   console.log(age); //error:age未定義(由於塊作用域)
}
userDetails('Haiyong');

19. 為什麼選擇 let 這個名字作為關鍵字?

let是一種數學語句,被早期的程式語言如Scheme和Basic 所採用。它是從數十種其他語言中借用而來的,這些語言let已經儘可能地作為傳統關鍵字使用var。


20.你如何在沒有錯誤的情況下重新聲明 switch 塊中的變量?

如果您嘗試在 a 中重新聲明變量,switch block則會導致錯誤,因為只有一個塊。例如,下面的代碼塊拋出如下語法錯誤,

let counter = 1;
switch(x) {
  case 0:
    let name;
    break;

  case 1:
    let name; // 重新聲明的語法錯誤。
    break;
}

為避免此錯誤,您可以在 case 子句中創建一個嵌套塊並創建一個新的塊範圍詞法環境。

let counter = 1;
    switch(x) {
      case 0: {
        let name;
        break;
      }
      case 1: {
        let name; // 沒有用於重新聲明的 SyntaxError。
        break;
      }
    }

希望大家能夠給海海 點讚+收藏+關注 ,你的支持是海海更新的動力!後面我會持續分享面試經驗 & 前端相關的專業知識。

最後祝大家都能找到滿意的實習和 offer!

關鍵字: