---
# System prepended metadata

title: JavaScript學習筆記
tags: [CMoney7th-戰鬥營學習筆記]

---

# JavaScript學習筆記
## 一、基本概念
1. java 需要編譯器，翻成電腦可以直譯的語言，再用直譯器跑；而==javaScript 是直譯式語言==，++直接寫完直接用直譯器跑++，所以比較容易爆炸，有爆炸時再去了解錯誤會比較快，初期不要太相信console，因為有可能印出來是已經被改變後的結果。
2. 是弱型別語言，變數的型態會一直變來變去：變數宣告後，可以任意變更成任何基本、參考資料型態、甚至是function。
3. 不是物件導向的語言，因此沒有所謂的類別概念，但仍有參考資料型態。
4. 程式執行的順序一樣是由左是右，可以不用寫分號，並且因為沒有字元所以雙引號跟單引號都可以，非常大量的使用callBackFunction。
6. 基本資料型態只有三種： 
    * String(java: char、String)
    * number (java: byte、short、int、long、float、double)
    * boolean
7. 參考資料型態，主要兩種：
    1. 物件(Object)：可以後補資料、無限巢狀(物件內+物件，json格式就是用類似javaScript的Object格式在寫的，如果沒要用keyPair就用array。 
        ++宣告方式++：大括號，裡面一定是類似HashMap，都是key,value 鍵值對 ex: {"key1":value1}。
        ++拿取方式++：object.keyName 即可 ex:`let a = {apple:123}`  -> a.apple = 123。
    2. 陣列(Array)：不用doubleArray，陣列裡面可以隨意放資料型態，也可以跳過順序，如果有跳過會預留空間。
        ++宣告方式++：直接中括號即可，不用new，ex:[]
        ++拿取方式++：a[index]即可。
    3. 陣列內也可以放物件，物件內也可以放陣列
    4. 記憶體觀念跟java一樣，參考資料型態，存的是記憶體位置，要特別注意。
    ```jsx
    //陣列
    let a =[]
    a[0] = 2
    a[2] = "test"
    console.log(a)
    ->[2, <1 empty item>, "test"]
    
    //物件
    var a = {
    	"key1" : 1,
    	"Key2": true,
    	"key3":{
    		"key3-1":2
    	},
    	"Key4": [1, 2, 3, 4, 5]
    }  
    a.key2 = "str"  //後面增加值
    console.log(a)
    ->{key1:1,key2:"str",key3:{"key3-1":2},
    key4:[1,2,3,4,5]}"
    
    a={"key1":1}
    a.key2 = 5  //後面增加值
    console.log(a)
    ->{key1:1,key2:5}
    
    ```
7. String沒有字串池，且在兩個資料型態不同時可以互相比較：
    * 兩個 == :無視型態比較 ex: `let a = "5" let b = 5 console.log(a == b) -> true`。
    * 三個 === 是會抓取型態的比較 ex:`let a = "5" let b = 5 console.log(a == b) -> false`。 
    * 參考資料型態也是可以無視型態比較，只是就會是false，但不會報錯。
8. console.log(a + b + c) 裡面就算是基本或參考資料型態，都可以串起來印出 ex: `let a = "5" let b = 5 let c = [1,2,3] console.log(a + " " +  b  + " " + c) -> 5 1,2,3 5`。
9.  如果資料還沒被寫出來可以讓你的資料是undefined，因此如果null代表的是有這筆資料就是null並非未定義。
10.  因為是直譯式語言，所以function，還沒呼叫就會先跑一次，要特別注意。
11.  func、object、arr 是同級的，所以直接變數存取即可，小括號內放要帶入的參數，但可以宣告參數但不傳，參數會按照順序給值。
        * 宣告方式：var 變數名稱 = (參數) => {func內容 }
        * object的value，可以放function，呼叫時就object.funcName()，ex: `b.func()`
        * 參數也可以放function進去。
12. function範例： 
```javascript
        //(function ex6寫法) 
        var a = () => {
            console.log("Test")
            //console.log("Test") = System.out.prinlnt("Test")。
        }
        console.log(a) -> [Function: a] //直接印func也不會報錯

        //小括號內放要帶入的參數，但可以宣告參數但不傳，參數會按照順序給值。
        var a = (q, w, e) => {
            console.log(q)
            console.log(w)
            console.log(e)
        }
        a() -> undefined,undefined,undefined
        a(1) -> 1,undefined,undefined
        a(1, 2) -> 1,2,undefined
        a(1, 2, 3) -> 1,2,3

        //呼叫object內的function
        var b = {
            func: a,
            key: "1"
        }
        b.func()
        console.log(b)

        {func: [Function: a],key:'1'}

        //(ex5寫法)
        var a(){
            console.log("Test")
        }

        //CallBackFunction
        let test (func) =>{
            func()
        }
        test() => {
            console.log("Hello world!")
        }
```
13. 變數宣告方法，var、let、const：
    * let是這個生命週期(大括號內)，99% 使用let。
    * var是生命週期更長，會超過function。
    * const是final的意思，生命週期最長。
    沒有static可用。
14. 可以導入強型別的語言的資料，但是到了javaScript後會變成沒有型別在處理。
15. 寫完要按存檔，重開程式，因為不是編譯器（terminal不用重開，可是要用ctrl + c 把程式關掉重開 npm run start，才會更新）。
16. 遊覽器預設只有get的方法，所以不能用別的方式傳資料 ex: post 。
`router.get('/' , function(req, res, next){
        res.render('index', { title: 'Express' });
}`
17. post 大部分都是用postman來測試。

### app.js文件名詞解釋
1. require = import的意思(ex5是import,ex6是require)，裡面放的是路徑(String)，導入時就會自己跑一遍。
./ 是當前路徑的資料夾在往內找：當前資料夾同層
../ 代表的是上一層：前一層資料夾同層
../../ 代表的是上上一層：前兩層資料夾同層
2. export = 將程式碼導出，只是把程式碼傳出去，Express 只是個名稱，不是類別。
3. app = 整個WEB API服務的核心（也就是express)，功能z分兩類如下：
    1. use (middleware 中介層)：當有人呼叫api時使用（跑資料），然後從上而下跑一次所有的use。
        ex:
        ```javascript
            app.use(logger('dev')) ->印出get...
            app.use('/',indexRouter) ->如果是當前網址，就跑indexRouter，也就是呼叫index.js。
            app.use('/users',userRouter) ->如果是當前管理者網址，就跑userRouter，也就是呼叫user.js
        ```
    2. get.post.put.delete：API使用
4. 因為app.use 跑到indexRouter -> index.js裡的`router.get('/',function(req,res,next){res.render('index',{title:'Express'})}`，
render : 渲染 - 印出這段文字在網頁上。
5. '/' 代表的是路徑後沒有其他資料，也就是說網址如果後面都沒加，會跑到index，如果是'/test'，網址後面加上/test就會叫到這個方法。
6. 簡單來說，因為會先跑app.use，所以會先讀看網頁到index 或 user的routes ，然後再看各自的檔案中有沒有撰寫/後對應的path，有符合的資料就做對應的事情，因為每個路徑其實就像是keyPair一樣，path正確，做相對應的function。

補充資料：[javaScript學習資源-w3school](https://www.w3schools.com/js/js_intro.asp)、[javaScript學習資源-it鐵人賽](https://ithelp.ithome.com.tw/users/20065504/ironman/1259?page=1)、[CallBackFunction](https://ithelp.ithome.com.tw/articles/10192739)、[Express 中介軟體](https://medium.com/pierceshih/%E7%AD%86%E8%A8%98-%E4%BD%95%E8%AC%82-middleware-%E5%A6%82%E4%BD%95%E5%B9%AB%E5%8A%A9%E6%88%91%E5%80%91%E5%BB%BA%E7%AB%8B-express-%E7%9A%84%E6%87%89%E7%94%A8%E7%A8%8B%E5%BC%8F-19082b1d8e06)


###### tags: `CMoney7th-戰鬥營學習筆記`