一些八股:1.fetch 的理解。2.let、const、var
一、 說說你對 Fetch 的理解,它有哪些優點和不足?
Fetch API 是現代 JavaScript 中用于進行網絡請求的接口,旨在替代傳統的 XMLHttpRequest。它提供了一種更簡單、更靈活的方法來獲取資源和與服務器進行交互。下面,我將詳細介紹 Fetch 的優點和不足。
Fetch 的優點:
語法簡潔直觀:Fetch 使用基于 Promise 的機制,這使得代碼更加簡潔易讀。相比于 XMLHttpRequest,它避免了回調地獄(callback hell),大大提高了代碼的可維護性。
fetch('https://api.example.com/data') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error));
更好的可讀性和可維護性:由于 Fetch 是基于 Promise 的,結合 async/await 語法可以使異步代碼看起來像同步代碼一樣,進一步提高代碼的可讀性。
async function fetchData() { try { const response = await fetch('https://api.example.com/data'); const data = await response.json(); console.log(data); } catch (error) { console.error('Error:', error); } }
更強的靈活性:Fetch 提供了一組豐富的選項(options),可以輕松設置請求方法、頭信息、請求體等。
fetch('https://api.example.com/data', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key: 'value' }) });
Stream 處理:Fetch API 支持對響應體的流式處理,可以逐步讀取響應數據,適用于處理大文件或實時數據。
fetch('https://api.example.com/data') .then(response => { const reader = response.body.getReader(); // 逐步處理數據 });
Fetch 的不足:
-
不支持進度監控:與 XMLHttpRequest 不同,Fetch 目前不支持原生的進度事件(如
onprogress),這使得在下載或上傳大文件時無法獲得進度更新。 -
對老舊瀏覽器的兼容性:Fetch 是現代 API,某些老舊瀏覽器(如 IE)不支持,需要使用 polyfill 來保證兼容性。
-
默認不發送 Cookies:Fetch 默認不會發送 cookies,需要手動設置
credentials選項。
fetch('https://api.example.com/data', { credentials: 'include' });
錯誤處理機制:Fetch 對于網絡錯誤和 HTTP 錯誤(如 404 或 500)的處理需要特別注意,因為只有網絡錯誤會觸發 catch,而 HTTP 錯誤仍會被視為成功的請求。
fetch('https://api.example.com/data') .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .catch(error => console.error('Error:', error));
二、理解 JavaScript 中的 let、const 和 var
在 JavaScript 中,聲明變量的方式主要有三種:var、let 和 const。每種方式都有其獨特的特性和適用場景。下面,我將詳細介紹它們之間的區別。
1. var
var 是最早在 JavaScript 中引入的變量聲明方式。它有以下幾個特點:
- 函數作用域:
var聲明的變量在函數內是局部變量,在函數外是全局變量。 - 變量提升:
var聲明的變量會被提升到函數或全局作用域的頂部,但變量初始化不會提升。 - 可重復聲明:同一作用域內,
var聲明的變量可以重復聲明。
function example() { console.log(a); // undefined var a = 10; console.log(a); // 10 } example();
2. let
let 是在 ES6 中引入的,用于聲明塊級作用域的變量。它有以下幾個特點:
- 塊級作用域:
let聲明的變量在塊級作用域內有效,不會污染全局作用域。 - 無變量提升:
let聲明的變量不會被提升,必須先聲明后使用。 - 不可重復聲明:同一作用域內,
let聲明的變量不能重復聲明。
function example() { if (true) { let a = 10; console.log(a); // 10 } console.log(a); // ReferenceError: a is not defined } example();
3. const
const 也是在 ES6 中引入的,用于聲明常量。它有以下幾個特點:
- 塊級作用域:
const聲明的變量在塊級作用域內有效。 - 不可變性:
const聲明的變量必須在聲明時初始化,且初始化后不可重新賦值(但對于對象和數組,其內部值是可變的)。 - 不可重復聲明:同一作用域內,
const聲明的變量不能重復聲明。
function example() { const a = 10; a = 20; // TypeError: Assignment to constant variable. const obj = { key: 'value' }; obj.key = 'new value'; // 這是允許的 console.log(obj.key); // 'new value' } example();

浙公網安備 33010602011771號