基本概念
什麼是 JavaScript?它的主要用途是什麼?
☞ JavaScript 是一種高階解釋性程式語言,用於建立互動式網頁,主要特性是動態類型、基於原型的物件導向、一流函數和詞法作用域是 JavaScript 的一些關鍵特性。
JavaScript 中的事件循環是什麼?
☞ 事件循環是 JavaScript 中處理非同步操作的機制。它不斷檢查呼叫堆疊和任務佇列,當堆疊為空時將函數從佇列移動到堆疊。
變數和數據類型⭐⭐⭐⭐⭐
JavaScript 中有哪些基本數據類型?
☞ JavaScript 有六種基本資料類型:string
、number
、boolean
、null
、undefined 和 symbol
(在 ECMAScript 6 中新增);Object
也是一種資料類型,包括數組和函數。
var
、let
和 const
的區別是什麼?
☞ var
是函數作用域,let
和 const
是區塊作用域。 var
變數可以重新宣告和更新,let
變數可以更新但不能重新聲明,const
變數不能更新或重新宣告。
什麼是 JavaScript 的類型轉換?
☞ JavaScript 是一種動態類型的語言,這意味著變量的類型可以在運行時改變。類型轉換通常分為兩類:隱式轉換
和顯式轉換
。隱式轉換
在運算過程中,JavaScript 自動將某個值轉換為另一種類型,例如在數字和字符串之間進行運算 console.log('5' + 3); // 8
;顯式轉換
是指程序員使用函數明確地將一種數據類型轉換為另一種。
==
和 ===
運算子有什麼差別?
☞ ==
在類型強制之後檢查值是否相等,而 ===
在沒有類型強制的情況下檢查值是否相等,也稱為嚴格相等。
作用域和閉包
什麼是作用域?
☞ 作用域是指變量、函數和對象可訪問的範圍。全局作用域 Global Scope 可以在代碼的任何地方訪問;函數作用域 Function Scope 只能在該函數內部訪問,外部無法訪問;區塊作用域 Block Scope ES6 引入了 let
和 const
,使得變量可以在區塊塊(如 if 語句或 for 循環)內部聲明,從而實現區塊作用域;作用域鏈 Scope Chain JavaScript 會首先在當前作用域中查找,如果找不到,就會向外層作用域(父作用域)查找,直到全局作用域,這個過程稱為作用域鏈;立即執行函數表達式 IIFE 在聲明時立即執行,並且具有自己的作用域。
解釋閉包的概念和使用情境。
☞ 閉包是在另一個函數(外部函數)內部定義的函數,並且可以存取外部函數的變數,自己可以存取自己的作用域、外部函數的作用域和全域作用域。
函數和 this
關鍵字⭐⭐⭐⭐⭐
this
在不同上下文中如何工作?
☞ this
指的是函數或方法所屬的對象,取決於函數的呼叫方式。它可以根據函數的呼叫方式更改其值。
什麼是建構子函數?如何使用它?
☞ 物件建構函式為給定值建立物件包裝器。如果是 null
或 undefined
,會建立並傳回一個空物件。否則,它將傳回與給定值對應的類型的物件。
JavaScript 中函數的幾種調用方式有什麼?
☞ 普通函數調用,直接呼叫就可以啟用;方法調用,當函數作為對象的方法時,這樣調用會將該對象作為 this
;構造函數調用 new
關鍵字調用函數時,該函數會成為構造函數,this
指向新創建的對象;使用 call
和 apply
;箭頭函數調用,但是不會綁定自己的 this
,而是從外部作用域繼承 this
。
異步程式設計⭐⭐⭐⭐⭐
什麼是 callback function?
☞ 回調函數是作為參數傳遞給另一個稍後執行的函數的函數,通常用於非同步程式設計、事件處理和函數式程式設計。
解釋 Promise
的基本概念和使用方式。
☞ Promise 是 JavaScript 中用於處理異步操作的一種對象。它提供了一種更直觀的方法來處理異步代碼,特別是相比於傳統的回調函數;Promise 可以在非同步操作完成時獲取結果,並且能夠避免回調地獄 callback hell 問題。
async
和 await
的作用和用法是什麼?
☞ async/await
是一種語法糖,用於以類似同步的方式編寫非同步程式碼;非同步函數傳回一個承諾,並且可以在非同步函數內部使用await來暫停執行,直到承諾得到解決。
ES6 特性
解構賦值是什麼?如何使用它?
☞ 可以從數組或對象中提取值並賦值給變量。
什麼是箭頭函數?與傳統函數有什麼不同?
☞ 箭頭函數是在 JavaScript 中編寫匿名函數的簡潔方法;與傳統函數表達式相比,它們的語法更短,並且不綁定自己的 this
、arguments
、super
或 new.target
。
模組化
什麼是 JavaScript 模組化?
☞ JavaScript 模組化是一種將代碼分割成可重用的獨立模組的方法;在模組化的系統中,每個模組通常是一個獨立的文件,包含特定的功能或數據。模組可以導出其內部的變量、函數和類,並且可以從其他模組中導入所需的功能;ES6 模組 ESM 使用 import
和 export
來導入和導出模組。
如何在 Vue.js 中使用組件模組化?
☞ 建立 component 在需要使用的檔案用 import
引入,當然也可以使用插槽 slot
在組件中插入動態內容,這樣可以使組件更加靈活。
性能優化
如何優化 JavaScript 的性能?
☞ 減少 DOM 操作、避免全局變量可以減少查找時間、優化迭代,在某些情況下,使用 for
循環比 forEach
或其他迭代方法更快;減少請求次數,將多個 API 請求合併成一個請求,減少網絡延遲,在可能的情況下,考慮使用服務端渲染(SSR)來提高首屏加載速度;盡量透過 CSS 而不是 JavaScript 進行動畫,減少 DOM 操作。
如何實現懶加載和代碼分割?
☞ 懶加載,只在需要時加載資源,以提高初始加載性能;代碼分割,將代碼分成小塊,根據需要進行加載,減少首次加載的大小。
錯誤處理
如何在 JavaScript 中處理異常?
☞ 在 JavaScript 中,處理異常主要依賴於 try...catch
語句,這是一種用於捕獲和處理錯誤的標準方法。
try...catch
的使用方式是什麼?
☞ try
放置可能會拋出錯誤的代碼;catch
用於捕獲和處理錯誤,可以獲取到錯誤對象。
如何處理 Promise 錯誤?
☞ 可以使用 .catch()
方法來捕獲任何在 Promise 執行過程中發生的錯誤;如果有多個 Promise 串聯在一起,也可以在鏈的末尾使用 .catch()
來捕獲整個
鏈中的任何錯誤。
安全性 -> 這個挺少看到
什麼是跨站腳本攻擊 XSS ?如何防範?
☞ XSS 是一種常見且危險的安全攻擊,可能導致數據洩露和用戶受損。通過正確的輸入驗證、輸出編碼、HTTP 請求標頭、避免內聯腳本以及保持軟件更新,可以有效防範這種攻擊。
什麼是跨站請求偽造 CSRF ?如何防範?
☞ CSRF 攻擊是一種利用用戶身份執行未經授權操作的漏洞。通過使用 CSRF 令牌、檢查請求來源、限制請求方法以及進行二次確認,可以有效防範 CSRF 攻擊。
Pascal triangle 巴斯卡三角形⭐⭐⭐⭐⭐
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
🍀 構想:前後都要一個 1,所以個函數是讓使用者輸入要多高,然後在最外層的迴圈先給前後 1,在內層做計算,最後再拼湊湊拼變成一列要的樣子。
function generatePascalsTriangle(rows) {
const triangle = Array.from({ length: rows }, () => Array(rows).fill(0));
for (let i = 0; i < rows; i++) {
triangle[i][0] = 1; // 每行的第一個元素
triangle[i][i] = 1; // 每行的最後一個元素
for (let j = 1; j < i; j++) {
triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j]; // 計算中間元素
}
}
// 打印三角形
for (let i = 0; i < triangle.length; i++) {
console.log(" ".repeat(triangle.length - i - 1) + triangle[i].slice(0, i + 1).join(" "));
}
}
generatePascalsTriangle(5);
Fibonacci 斐波那契數列
🍀 構想:斐波那契數列就是一開始是 0, 1,第三個就是第一個加第二個值變成 0 + 1 = 1,第四個就是第二個加第三個值變成 1 + 1 = 2...
function fibonacci(n) {
const fib = new Array(n);
fib[0] = 0;
fib[1] = 1;
for (let i = 2; i < n; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
return fib;
}
console.log(fibonacci(10)); // [0,1,1,2,3,5,8,13,21,34]
字串反轉
🍀 構想:字串轉陣列候用陣列方法處理
const reverseString = (str) => [...str].reverse().join("");
console.log(reverseString("上上下下左左右右")); // "右右左左下下上上"
奇數偶數分群
🍀 構想:用 2024 年的新方法分群
Map
物件是鍵值對的集合,其中鍵可以是任何類型。它允許您基於鍵存儲和檢索數據,並保留元素的插入順序。
const data = [1, 2, 3, 4, 5, 6];
const separateOddEven = Map.groupBy(data, (n) => (n % 2 === 0 ? "even" : "odd"));
console.log(separateOddEven.get("even")); // [2, 4, 6]
console.log(separateOddEven.get("odd")); // [1, 3, 5]
const data = [1, 2, 3, 4, 5, 6];
function separateOddEven(numbers) {
const oddNumbers = numbers.filter(num => num % 2 !== 0);
const evenNumbers = numbers.filter(num => num % 2 === 0);
return { oddNumbers, evenNumbers }; // 返回物件
}
刪除重複索引
🍀 構想:用 ES6 的方法直接過濾
Set
物件是唯一值的集合,其中每個值只能出現一次。它提供了添加、刪除和檢查元素是否存在的方法。
const data = [1, "star", 2, 3, 4, "star", 5, 6, 5, 4, 3, "star"];
const uniqueData = [...new Set(data)];
console.log(uniqueData); // [1, 'star', 2, 3, 4, 5, 6]
線上學習資源
書籍
練習
恭喜完賽!!!很喜歡你文章敘述的感覺
謝謝你,你的文章也給我不少靈感,尤其是Vue 3 用實作帶你看過核心概念 - Day 21: 組件透傳屬性(Attributes)的應用,因為我前專案負責人不喜歡用 provide/ inject 所以元件之間的溝通研究不少方法,其中有一個就是這天的內容,你寫得真的很棒!
能幫助到你真的太好了,成就感滿滿 ❤️