## 6/27 JavaScript ### 變數(Variable)、常數(Constant) expression表達式 //表達式會有結果 statement陳述句 //一個陳述句會有很多表達式 REPL = Read Eval Print Loop(互動式的編程環境) 例:終端機也是一直運作文字標閃閃閃(一直在運作) **undefined //存在但沒有設定值** ```javascript console.log(a); var a = 1 ``` **not defined //不存在** ```javascript console.log(b); let a = 1 ``` **no initialization //沒初始化** ```javascript console.log(a);//因為TDZ let a = 1 ``` *** ### 變數提昇(Variable Hoisting) JS有兩階段 (**建立期** 跟 **執行期**) **建立期** 註冊名稱+初始化(initialization) **執行期** 賦值/執行函數 沒有初始化一樣可以賦值 函數宣告不會有變數提升的情況 所以擺放位置不影響 ```javascript function 名稱() { //內容 } ``` 函數運算式會有變數提升的情況 所以擺放位置很重要 ```javascript const 名稱 = function() { //內容 } ``` *** ### var vs let 宣告細節 **var**會做初始化 **let**不會做初始化 所以報錯並不是not defined 但let會有TDZ(Temporal Dead Zone)暫時死區 >第一階段(建立期)宣告後(變數)會變 TDZ 第二階段(執行期)沒有覆值 就無法使用 換句話說 let 進行建立期要給値後 才復活變數 **const可以改變內容 但無法重新指定re-assigh** ```js const a = [1,2,3] a[1]='x'//可以更換 console.log(a); a=[3,4,5]//不能重新定義 ``` *** ### Scope(範圍) Function Scope(函式範圍) var 關得住 Block Scope(區塊範圍) let 關得住 var 關不住 函數在第一階段就能做完建立期和執行期 所以宣告寫在前面還是可以運作 ```js function hi(){ var a='hi,帥哥美女' console.log(a); } // Function Scope { let b='龍哥好帥' console.log(b); } // Block Scope ``` not a function = undefined ***詞彙範疇(Lexical Scope)*** ```js let b='龍哥沒比我帥' function hi(){ var a='hi,我好帥' let b='龍哥比我帥' console.log(a); compare() } // Function Scope function compare(){ console.log(b); } // Block Scope hi()//答案'hi,我好帥' '龍哥沒比我帥' //scope寫在哪就從哪裡抓 ``` *** ### 全域物件:window(瀏覽器專用) 只要是在window裡的物件就可以不用加window **var** 和 **表達式** 在全域變數跟區塊會污染全域物件 如果用var設定window裡的物件會覆蓋(汙染) ```javascript //嚴格模式(因為相容性所以使用字串) "use strict" //使用宣告優先順序 const > let >>>> var ``` *** ### 呼叫堆疊(call stack) 函式(function) 就像是一個泡泡 執行完就會破掉並回傳值 return只能放在function裡面 call stack 只有一個也會堆疊 如果有呼叫其他函式越上面的會堆疊在最下面 堆疊理論上是無上限但程式或是記憶體受限會有上限 (python 預設 1000上限) *** ### stack overflow(程式社交平台) 單一真實來源概念 (SSOT/single source of truth) 所有人集中到一個位置共享數據做出評論,認證越多正確的可信度越高 stack overflow 就是有 SSOT 去驗證正確性 *** ### type coercion(強制轉換) ```js //強制轉型(Type Coercion) console.log(1 + 2)// 3 console.log(1 + '2')// '12' console.log("hello" + 123)// 'hello123' console.log("hello" + true)// 'hellotrue' console.log(123 + true)// 124 console.log(123 + false)// 123 console.log([] + [])// console.log([] + {})// [object Object] console.log({} + [])// [object Object] console.log({} + {})// [object Object][object Object] ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up