## HTML ### 1. 語意化標籤 例如 `<header>`, `<section>`, `<footer>` 讓結構一目了然有助於開發體驗,也因為結構清晰可以讓 SEO 分數更高。 ## CSS ### 1. CSS 樣式的優先順序 **定義解釋:** - **Inline Style** 是指直接用 `style=''` 將樣式寫在 HTML tag 中。 在 Vue Template 中可以用靜態 `style=''` 也可以用動態 `:style=''` - **Internal Style** 如果是純 HTML 文件,指的是放在 `<style>` 標籤中的樣式。如果是 Vue,則是放在 `<style scoped>` 中的樣式。 - **External Style** 如果是純 HTML 文件,指的是透過 `<link>` 標籤引用的外部樣式。如果是 Vue,可以透過 `<style src="">` 來外部引入樣式。 **優先順序:** - **純 HTML 文件 ([**CodePen 實作測試**](https://codepen.io/ehxqjekz-the-reactor/pen/bNGWrqP)):**`inline` > `internal` = `external` (後兩者依先後順序而定) - **Vue 組件([**CodeSandBox實作測試**](https://codesandbox.io/p/devbox/unruffled-tdd-dr8gsw)):** `inline` > `internal` > `external` - `!important` 又會比 `inline` 權重更高! ### 2. 選擇器的優先順序 important! > inline style > id > class = attribute = psedo class ..... ### 3. box-sizing, border-box 當 width 相同時,若使用 `box-sizing: border-box;`,就會將 padding 和 border 包含進寬度中。而若未指定為 `box-sizing: border-box;`,預設是 `box-sizing: content-box;`,寬度就會是 width + border + padding => [**CodePen 實作練習**](https://codepen.io/ehxqjekz-the-reactor/pen/raNmGQQ) ### 4. rem 與 pixel 差別 px 是絕對值,rem 是相對值,相對於 `<html>` 這個根元素的大小,以字體為例,預設 `<html>` 的字體大小為 16px。 => [**CodePen 實作練習**](https://codepen.io/ehxqjekz-the-reactor/pen/LEYyzKE) ### 5. `display: none` 和 `visibility: hidden` 的差別 - `display: none` 不會將元素渲染出來,不會佔用空間,DOM 節點不存在。 - `visibility: hidden` 會將元素渲染出來,會佔用空間,DOM 節點存在。 => [**CodePen 實作練習**](https://codepen.io/ehxqjekz-the-reactor/pen/YPzVEXW) ### 6. position 有哪些類別? - absolute: 絕對定位 - relative: 相對定位 - sticky: 固定定位 - fixed: 特殊的相對定位 - static: 靜態定位(預設 position) => [**CodePen 實作練習**](https://codepen.io/ehxqjekz-the-reactor/pen/pvoPdEQ) ## UnoCSS ### 1. config 檔案可以做什麼設定 shortcuts 就是一個快捷,可以把多個樣式設定成縮寫。 rules 可以更客製化 其他就包含 theme, preset 等等。 ## JavaScript ### 1. 什麼是閉包 簡單來說就是當外層的函數運行結束後,內層的狀態依然可以被記得。 今天面試中提到抽離出 Vue Composables 就是運用這樣的概念! => [**CodeSandBox實作練習**](https://codesandbox.io/p/devbox/brave-rubin-y97y9z?file=%2Fsrc%2Fcomponents%2FHelloWorld.vue%3A13%2C10) ### 3. `for` loop 和 `forEach` 差別 1. 語法上 **for loop** ```javascript= const numbers = [1, 2, 3, 4, 5]; for (let i = 0; i < numbers.length; i++) { console.log(numbers[i]); // 1, 2, 3, 4, 5 } ``` **forEach** ```javascript= numbers.forEach((num) => { console.log(num); // 1, 2, 3, 4, 5 }); ``` 2. 差異:`for` loop 可以加入 `break` 或是 `continue`, `forEach` 則是無法終止操作。 ### 4. map 和 forEach 差別 最大差別就是 `forEach` 不會回傳值,只會針對陣列中的每個元素作用。 但是 `map` 會將整個陣列回傳! ### 4. Arrow function 和一般函數的差別 1. 寫法簡潔,可以省略 return ```javascript= const addSimple = (a, b) => a + b; console.log(addSimple(2, 3)); // 5 ``` 但一般函數就必須把 return 寫出來。 2. this 用法:在同一個 composable 函數中,箭頭函數無法使用 this 來找到對應值,會向外找。但一般函數就可以正常引用。 舉例: ```javascript= const user = { name: 'HY', normalFunction: function() { console.log(this.name); // `this` 指向 `user` }, arrowFunction: () => { console.log(this.name); // `this` 指向外層 (Window 或 undefined) } }; user.normalFunction(); // HY user.arrowFunction(); // undefined ``` 3. 箭頭函數無法使用 `new` 方法,一般函數可以使用。 ### 4. Event Loop 是什麼? 因為 JavaScript 本身是 single-thread 的,所以當主程式、非同步的程式(例如需要等待後端回傳 response)為了不用一直等待後端回傳使執行整個卡住導致體驗不佳,我們就有這個機制。 當主程式執行完後,Event loop 這個機制就會依序讓 callback function(像是 setTimeout 或是 API 請求)依照先進先出的順序去執行。 例如: ```javascript= console.log("主程式1"); setTimeout(() => { console.log("非同步任務1"); }, 100); setTimeout(() => { console.log("非同步任務2"); }, 100); console.log("主程式2"); ``` => 執行結果是 主程式1, 主程式2, 非同步任務1, 非同步任務2 ## Vue ### 1. Composables 跟使用 Pinia 的差別? 接續閉包的概念,composables 中可以用 ref 加入狀態,再於 .vue 檔案中引用,但他的狀態一樣是暫時性的,作用範圍也是引入 composables 的頁面或組件,不像 pinia 可以作用於全域範圍,並且可以進一步透過 localStorage 等方法永久保存。 => [**CodeSandBox實作練習**](https://codesandbox.io/p/devbox/brave-rubin-y97y9z?file=%2Fsrc%2Fcomponents%2FHelloWorld.vue%3A13%2C10) ### 2. 什麼是 `defineExpose` `emit` 可以子傳父,`defineExpose` 也可以子傳父!差別在於 `emit` 需要透過事件觸發來啟動,`defineExpose` 是指要把想要暴露的值放在裡面就可以了。 => [**CodeSandBox實作練習**](https://codesandbox.io/p/devbox/3ytk9y?file=%2Fsrc%2FApp.vue%3A23%2C10) ### 3. 在 template 上面使用 ref 代表什麼意思 就是建立一個 reference,讓我們可以抓取元素並操作元素。 => [**CodeSandBox實作練習**](https://codesandbox.io/p/devbox/gdr9zy) ### 4. `shallowRef` 是什麼 淺層的追蹤。當 ref 是物件時,使用 `shallowRef` 來定義,當物件的深層屬性更新時,並不會觸發頁面重新渲染。但是 ref 就會觸發重新渲染。 ## TypeScript ### 1. 使用 TS 有什麼好處? 除了稍早提到增加可讀性、易於維護跟重構以外,主要就是型別安全,在執行前的編譯階段可能就會顯示出錯誤,可以提早排錯。 ### 2. `type` 和 `interface` 差別 1. `interface` 可以透過 `extends` 擴充,也可以合併。 => 適合用在描述物件,尤其是 API 回傳的 response 3. `type` 不能合併。但可以定義 `union type`。 => 適合定義固定的選項。 ### 3. `enum` 和 `interface` 差別 1. `enum` 適合用在有固定值的狀態。e.g. 狀態碼 2. `enum` 可以做字串的映射:用 value 取得 key 也可以用 key 取得 value,`interface` 則不能。 3. `interface` 可以透過 `extends` 擴充,也可以進行合併,`enum` 沒有這些彈性,不能修改。 ### 3. Union Type 使用時機 例如當變數可能有多種型別時(可能是這個,也可能是那個,不是非常確定) ```javascript= let id: string | number; ``` ### 4. Pick, Omit 是什麼 **Pick: 把某個屬性挑出來** ```javascript= interface User { id: number; name: string; age: number; } type UserName = Pick<User, 'name'>; const userName: UserName = { name: "HY" }; console.log(userName); // HY ``` **Omit: 把某個屬性排除掉** ```javascript= interface User { id: number; name: string; age: number; } type UserWithoutAge = Omit<User, 'age'>; const userWithoutAge: UserWithoutAge = { id: 123, name: "Tyler" }; console.log(userWithoutAge); // { id: 123, name: 'Tyler' } ``` ### 5. 有一個陣列,若參數是字串則回傳字串,若參數是數字則回傳數字 (布林值...? 有點忘記題目QQ)