# JS 直播班- 筆記專區 ## WEEK 01 周末小任務 ## var、let、const 的差異? ### var (全域變數) 宣告一個可隨意更改其內容的變數 * 因為容易汙染全域,所以不建議使用。 * 將變數宣告成全域的話,可能會有以下幾個問題: 1. 變數名稱衝突,發生預期外的程式錯誤。 2. 佔用記憶體,無法回收。 ### let(區塊變數) * 用於宣告一個「只作用在當前區塊的變數」,可隨意更改其內容,但不能重複宣告。 * 重複宣告就會報錯,範例如下: ![](https://i.imgur.com/0YKRgkp.png) ### const * 宣告一個只可讀取的不可變常數。類似*let*具有區塊範圍,但const宣告的變數不能重複賦予值,也不能重複宣告。 * 重新賦予值會報錯,範例如下: ![](https://i.imgur.com/YPx2D5h.png) ### 補充: *全域/函式/區塊範疇(global/function/ block scope): >範疇(scope)為變數可作用或可視的範圍[color=#fa0]。 * 全域範疇(global scope) * 可以在任何地方取用變數的範圍,不再函式也不再區塊內。 * 函式範疇(function scope) * 變數只存活在函式裡面。在ES6之前,JS 只有全域及變數範疇。 * 區塊範疇(block scope) * 變數只存活在{} 裡面,概念跟函式範疇很像。因應ES6新增let 和const,才新增了區塊範疇。 * var 不適用block scope。var本身為全域變數,因此使用{}來宣告範圍並不具任何意義。如下範例: ![](https://i.imgur.com/EiRkMtZ.png) ### 重點歸納(變數宣告方式) | | var | let | const | | ---------- | ---- | -------- | ---------- | | 範圍 | 全域 | 當前區塊 | 當前區塊 | | 重複宣告 | 可 | 不可 | 不可 | | 重新賦予值 | 可 | 可 | 不可(不易) | | 函式範疇* | 是 | 是 | 是 | | 區塊範疇* | 否 | 是 | 是 | ## call by reference (傳參考)、by value(傳值) 參數引用的方式基本可分成++Call by value++ & ++Call by reference++。 ### Call by value(傳值) * 要將參數傳遞到另個變數上時,直接複製一份給新變數。 * 原本的變數和新變數都各佔一個記憶體空間,因此修改其中一個並不會造成另一個也連動。 * 所有基本型別都是這類型的。 * 範例如下 ![](https://i.imgur.com/KqZ6MYn.png) ### Call by reference(傳址) * 要將參數傳遞到另個變數上時,並不會再給一個新的位置,而是將原本的記憶體位置直接指向新變數上面。 * 值與值之間是連動的,故改變其中一個值後,另一個也會跟著改變。 * 物件/陣列/函式都是這類型的。 * 範例如下: ![](https://i.imgur.com/HSwnBl9.png) * **==例外: 如果是直接用等號賦予新值,則會產生一個新的記憶體空間。==** ![](https://i.imgur.com/qGRcmA5.png) ## undefined 與 null 的差異 ### undefined * 沒有賦予值的意思。 * 如變數本身沒有回傳值的話,預設為underfined。 * undefined 本身就是型別的類型之一。 ![](https://i.imgur.com/Uebdve5.png) ### null * 有被賦予值,被設定為空值。 * 可用於清空資料來釋放記憶體空間 (比如當一個值不再需要使用時) * 屬於物件(object)類型。 * 操作DOM元素時,如果想要抓取的元素並不存在,會回傳null。 ![](https://i.imgur.com/NGesOTf.png) ### undefined + null * 兩者都是基本型別(primitives types)的一種。 ## WEEK 02 周末小任務 ## if、switch 差別 先看MDN 的解釋怎麼說。 >**[if...else](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Statements/if...else)** 當條件成立的時候會執行 if 陳述式裡的程式,而不成立時則執行另外一個陳述式。 >**[switch](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Statements/switch)** switch 語句 會比對一個 表達式 裡頭的值是否符合 case 條件,然後執行跟這個條件相關的 陳述式, 以及此一符合條件以外,剩下其他條件裡的陳述式。 簡單來說,兩者都是用於需要判斷某個表達式是否符合某條件的狀況。而兩者的差異主要在==語法==和==使用時機==上。 ### 語法 ```== // if 語法 if (boolean){ statement1} // 如果符合條件式內容,則會執行statement 1 else if(boolean){ statement2 } //如果不符合條件式1,但符合條件式2,會執行statement 2 else { statement3} // 如果不符合條件式,則會執行statement3 // switch 語法 switch (表示式){ case 值1 : 語句1 break; case 值2 : 語句2 break; ... default : 語句n break; } ``` ### 使用時機 * 如果有明確的選擇值,而不需要複雜的運算和判斷,就可以使用switch。 * 如果需要進行特定範圍內的運算判斷,例如 (a>=2&&b<=10),適合用if else。 ## 何謂強制轉型、以及如何作到轉換型別? ### 強制轉型(coercion) 當兩個不同型別的值需做運算時,JS會自動將其中一方轉成數字(number)或字串(string)。 * 值1(string)+值2(number):值2會被轉成字串,結果為字串 * 值1(string)-值2(number):值2會被轉成數字,結果為數字 * 值1(string)\*值2(number):值2會被轉成數字,結果為數字 * 值1(string)\值2(number):值2會被轉成數字,結果為數字 > 結論為,除了加法會變成字串相加以外,其他JS會轉換成數字型別。 範例如下: ![](https://i.imgur.com/4bhdBf8.png) ### 如何轉換型別 #### 字串&數字轉換 * parseInt(): 將輸入的字串轉成整數。 * 語法: `parseInt(string, radix)`; * `string`:待轉換的字串 * `radix`:能代表該進位系統的數字。(預設值為10進位?) * toString(): 將數值以字串形式回傳。 * 語法: `toString()`。 ```== let c = 1 c = c.toString(); \\結果為 字串:"1" ``` ## 參考文件: Week 01:[1](https://snh90100.medium.com/javascript%E4%B8%ADundefined%E5%92%8Cnull%E7%9A%84%E5%B7%AE%E5%88%A5-1f48e9be5e02)|[2](https://medium.com/itsems-frontend/javascript-pass-by-value-reference-sharing-5d6095ae030b)|[3](https://blog.techbridge.cc/2018/06/23/javascript-call-by-value-or-reference/)|[4](https://pjchender.blogspot.com/2016/03/javascriptby-referenceby-value.html)|[5](https://twitter.com/fanny_codes/status/1289561087206203393?s=21)|[6](https://www.w3schools.com/js/js_scope.asp)|[7](https://cythilya.github.io/2018/10/17/what-is-scope/)|[8](https://josephcardillo.medium.com/the-difference-between-function-and-block-scope-in-javascript-4296b2322abe) Week 02:[1](https://www.itread01.com/content/1549602198.html)|[2](https://kknews.cc/zh-tw/code/8q6zonn.html)|[3](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Statements/switch)|[4](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Statements/if...else)|[5](https://developer.mozilla.org/en-US/docs/Glossary/Type_coercion)
{"metaMigratedAt":"2023-06-16T12:08:00.359Z","metaMigratedFrom":"Content","title":"JS 直播班- 筆記專區","breaks":true,"contributors":"[{\"id\":\"1325c7a3-69e4-443b-b471-1c20cc80be78\",\"add\":6050,\"del\":1640}]"}
Expand menu