---
# System prepended metadata

title: 6/27 修改
tags: [JavaScript]

---

## 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]
```
