# 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-戰鬥營學習筆記`