---
# System prepended metadata

title: 前端工程師面試題 Day1
tags: [面試]

---

# 前端工程師面試題 Day1
###### tags: `面試`
## Q1 undefined 和 null 的差別

1. `undefined`
    * 指的是變數沒有宣告，或是已經宣告但沒有賦值。
    * Javascript 將未賦值的變數預設為 undefined。
    * typeof undefined = undefined。
    * 當要取用一個物件的屬性或陣列的元素時，若該屬性/元素不存在，則回傳 undefined。
    * 若一個函式需要參數傳入，但在調用函數時該元素不存在，回傳 undefined。
    * 轉換成數值時為 NaN。
    * 不是有效的 JSON。
2. `null`
    * 表示空對象，沒有值的值。
    * 用來給開發者宣告空值的。
    * typeof null 回傳 object。
    * 轉換成數值時為 0。
    * 是有效的 JSON。

### 相似處
1. 都沒有屬性及方法，也不能額外添加屬性方法。
2. 皆為 Falsy 值。
3. 皆為原始型別。

### 特別
```javascript
null == undefined //true
null === undefined //false
```

### 延伸
強制轉型
https://www.cythilya.tw/2018/10/15/coercion/

### 參考
https://www.jstips.co/zh_tw/javascript/differences-between-undefined-and-null/
https://snh90100.medium.com/javascript%E4%B8%ADundefined%E5%92%8Cnull%E7%9A%84%E5%B7%AE%E5%88%A5-1f48e9be5e02
https://medium.com/@hooviva77/javascript%E5%9F%BA%E7%A4%8E-%E4%B8%80-null-%E8%B7%9F-undefined-%E7%9A%84%E5%B7%AE%E5%88%A5-153d8e6adf55

## Q2.Reset CSS 是甚麼

由於每個 HTML 標籤都有 CSS 預設值設定，早期各個瀏覽器都有各自的預設樣式，因此為了讓程式碼在各個瀏覽器間不會樣式跑掉，所以需要重置 CSS 預設樣式。

最常見的有兩個：
1. CSS Reset (meyerweb 提供)：

沒有提供 CDN ，就是直接複製到 CSS 樣式的最前面。
只有更新到 2.0 (2011)

2. normalize.css：

保留了一些瀏覽器預設的樣式，並採納了所有的瀏覽器的樣式差異去做調整。
有在持續更新，也支援 HTML5。
很多 CSS 框價都選用 normalize.css ，例如 bootstrap。



### 參考
https://israynotarray.com/css/20210807/3641451940/
https://andy6804tw.github.io/2021/05/23/css-reset/

[Reset css](https://meyerweb.com/eric/tools/css/reset/)
[Normalize.css](https://necolas.github.io/normalize.css/)

## Q3. Hoisting 是甚麼
1. var 宣告提升。
2. function 宣告提升。
3. function 優先權大於 var。
4. function > arguments > var
5. let 跟 const 也有 hoisting 的效果，只是提升後的行為不一樣，let 跟 const 沒有初始化為 undefined ，而且在賦值前取值會發生錯誤 TDZ


### 參考
https://developer.mozilla.org/zh-TW/docs/Glossary/Hoisting

https://blog.techbridge.cc/2018/11/10/javascript-hoisting/