---
# System prepended metadata

title: JS 筆記

---

# JS 筆記

## 宣告變數的方法：let、const、var
* **var (全域變數)**
    宣告一個可隨意更改其內容的變數
    * 因為容易汙染全域，所以不建議使用。
    * 將變數宣告成全域的話，可能會有以下幾個問題:
        1. 變數名稱衝突，發生預期外的程式錯誤。
        2. 佔用記憶體，無法回收。
* **let(區塊變數)**
    用於宣告一個「只作用在當前區塊的變數」，可隨意更改其內容，但不能重複宣告。
    
    ![](https://i.imgur.com/0YKRgkp.png)

* **const**
    宣告一個只可讀取的不可變常數。類似*let*具有區塊範圍，但const宣告的變數不能重複賦予值，也不能重複宣告。
    
### 重點歸納(變數宣告方式)
 
|            | var  | let      | const      |
| ---------- | ---- | -------- | ---------- |
| 範圍       | 全域 | 當前區塊 | 當前區塊   |
| 重複宣告   | 可   | 不可     | 不可       |
| 重新賦予值 | 可   | 可       | 不可(不易) |




    
    
## 基本型別(primitives types) 介紹
* 字串 (String)
* 數字 (Number)
* **布林 (Boolean)** : True & False
* **undefined**: 尚未被賦予值。
* **null**: 有被賦予值，被設定為空值。
	* 可用於清空資料來釋放記憶體空間
	(比如當一個值不再需要使用時)
* Symbol
* 型別操作方法


## 觀念補充
* **小駝峰命名**
程式命名一種規則，第一個單字以小寫字母開始；第二個單字的首字母大寫，例如：firstName、lastName。
    (**建議使用這種方式**。)

* **修改變數的值**:
變數與變數之間是沒有連帶關係的，也就是說改任何一個變數的值不會影響其他變數，除非是呼叫了某個函式會將變數又重新賦予值一次
* **一行宣告一個變數或常數**
除錯時比較好知道哪行要做修正。範例如下:
```=
\\不好的宣告方式
const a = 1,
b=2,
c=3;

\\好的宣告方式
const a=1
const b=2
const c=3
```

## 方便除錯的函式: console.log()

* **console.log()**
1. 可以將變數值直接顯示在chrome 開發人員工具裡面。
2. 用法為直接在要偵測的地方加入console.log(“字串“)即可。
	* 可一次顯示多個變數值，做法為直接在括號裡面放入一個以上的變數，並用**逗號**做區隔。 
	* 如果想要一行顯示一個變數值的話，就需要分開來撰寫。
```=
let a =3;
let b =2;
let c =1;
console.log(a);
console.log(b);
console.log(a,b); //括號裡面也可以放多個值，但會顯示在同一行。
```
效果呈現如下:

![](https://i.imgur.com/YaheN1R.png)

* **補充: alert()**

1. 靠alert 方式也可以將變數用彈跳式視窗顯示出來。

![](https://i.imgur.com/YRM1CdB.png)

3. 寫法為在alert()加入想要顯示的變數名稱。但要注意以下幾點:
	* alert 的括號中只能代入一個參數。
	* 參數不管是什麼型別，它都會轉成字串顯示
	* 如果需要顯示多個參數的話，可以用字串相加的方式來處理。
	例如 alert(a + "," + b + "," + c) 
	![](https://i.imgur.com/XEuypIL.png)
	
3. 如果需要顯示多個參數，會建議使用console.log()。
4. 

## 數字型別與賦值運算子

### 賦值運算子
* 一個賦值運算子就是右方的運算元的值賦予給在其左方的運算元，最簡單的復職運算子就是*等於 (=)* 。
* 復合運算子:為簡化運算的流程，會將某些運算子做複合。
比如下方例子:
	* `x += y` = `x = x + y`
	* `x -= y` = `x = x - y`
### 算術運算子
* **增加 (++)**
	* 一元運算子。 將運算元增加1。
	* 如果將運算元(++)放在變數前，會回傳增加1以後的值。
	![](https://i.imgur.com/icVnyB1.png)
	* 如果將運算元(++)放在變數後，則會回傳原本的值。
	![](https://i.imgur.com/2X8bHUy.png)
* **減少 (- -)**
	* 一元運算子。 將運算元減少1。
	* 如果將運算元(--)放在變數前，會回傳減少1以後的值。
	* 如果將運算元(--)放在變數後，則會回傳原本的值。

	
## 字串型別

### 基本觀念
* **宣告字串**: 需用" " 或是' ' 將字串包起來。
* **字串與字串&數字相連**: 使用加號(+)做連接。
* **變數名稱.length**: 用來查詢字元數。
```=
let friendName = "Tom";
console.log(friendName.length); \\結果為3
```
* **typeof**: 用來查詢狀態。
```=
let friendName = "Tom";
console.log(typeof friendName); \\結果為"string"
```
* **NaN** :star2:: 全域屬性，表示非數字（Not-A-Number）。
![](https://i.imgur.com/UzAKclo.png)
	* 補充一點，雖然NaN是被JS判斷成非數值型態，但如果使用typeof 去查詢，會發現還是顯示成++數值++。
	![](https://i.imgur.com/387CyFZ.png)
* **trim()** :star2::++用來移除字元間的空格++。以下方程式碼為例，只有加上trim()的那一行最後印出來的結果會是沒有空白字元的。
```=
const greeting = '  Tom   ';

console.log(greeting);
// expected output: '  Tom   ';

console.log(greeting.trim());
// expected output: 'Tom';
```
* **樣板字樣值** :star:: 允許在其中嵌入運算式的字串字面值(string literals）

	* 寫法為用反引號\` \`（back-tick）將字元封閉，需加入運算式的地方則加上${變數名稱}即可。範例如下:
```=
let myName = "Mary";
let myHeight = 189;
let total =`我現在${myHeight}公分，我是	${myName}。
console.log(total) `;
\\expected output: 我現在189公分，我是Mary。
```

### 字串&數字轉換

* **parseInt()**: 將輸入的字串轉成整數。
	* 語法: `parseInt(string, radix);`
		* `string`:待轉換的字串。
		* `radix`:能代表該進位系統的數字。(++預設值為10進位?++)
* **toString()**: 將數值以字串形式回傳。
	* 語法: `toString()`
```=
\\小例子如下
let c = 1
c = c.toString(); \\結果為 字串:"1"
```
## 比較運算子

* **常見的比較運算子有**: 大於(>)、小於(<)、等於(==)、大於等於(>=)、小於等於(<=)、不等於(!=)。

### 等號(=)分析
* **一個等號(=)**:作用為賦予值。
* **兩個等號(==)**: 比較運算子的意思。
	* 如果比較值並非數值(ex.字串 "1")，會自動協助轉型成數值狀態，也因此比較不嚴謹。
* **三個等號(\=\==)**:也是比較運算子。 
	* 作用會比兩個等號(==)還要嚴謹，==除了比較數值以外，也會判斷型別是否一致==。
	* 比較推薦使用這個。:bookmark: 

![例子](https://i.imgur.com/Y9EZEId.png)
(以上為`==` & `===` 使用上差異的範例)

## 邏輯運算子

> 邏輯運算子 通常被用於布林(邏輯)值; 使用於 布林(邏輯)值時， 它們會回傳布林型態的值。 然而，&& 和 || 運算子實際上是回傳兩指定運算元之一，因此用於非布林型態值時，它可能會回傳一個非布林型態的值。 [ref.: MDN ](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Expressions_and_Operators#%E9%82%8F%E8%BC%AF%E9%81%8B%E7%AE%97%E5%AD%90)

### 邏輯 AND (&&)

* 當某值同時滿足兩個(或以上)的條件時，才會回傳True。

```=
// && 練習
//符合贈裡條件
// 必須同時符合以下兩個條件才贈禮
//消費滿500(含)
//是VIP 條件
//買特定蛋糕
let a = 600;
let isVip =true;
let buyCake =false;
let giftResult = a >= 500 && isVip == true && buyCake == true;
let giftPrint = `是否贈禮: ${giftResult}`
console.log(giftPrint);

//expected output:是否贈禮: false
```

### 邏輯 OR (||)
* 設定兩個(或以上)的條件，當某值滿足其中一項，就會回傳True。

```=
// || 練習 or
//小孩吃東西
// 只要冰箱有米飯或蘋果或牛奶，小朋友會吃

let haveRice = false;
let haveApple = true;
let haveMilk =false;
let isEat = haveRice == true || haveApple ==true || haveMilke == true;
let isEatPrint= `是否吃飯: ${isEat}`
console.log (isEatPrint);

//expected output:是否吃飯: true
```

## 流程判斷 - if、else if、else
### 重點整理
* if & else 只會出現一次，但else if 可以出現很多次。
* else 不一定要有。
* **語法如下**
```=
if (條件式){
   statement1}
else if (條件式){
statement2

} // 可多個，可略
else{
   statement3}// else 可略
```
## 陣列 Array & 物件 Object
### 陣列 Array 
#### 基本介紹
* 屬於全域物件，用於建構陣列。
* 沒有固定的長度與型別。
* 可以同時放數字、字串或其他型別。
* 語法: `let 變數名稱=[值1, 值2, 值3,...]`
* 可指定陣列裡面的值為新的變數。範例如下
```=
let colors = ['red','black'];
let myFavoriteColor = colors[1];
console.log (myFavoriteColor);
// expected Output: 'black';
```
### 讀取、寫入、刪除
#### 讀取
* 可直接讀取整個串列或是特定某個值 (ex. `colors[0]`)
* 如果變數尚未設定，則會顯示undefined
* 一開始先設定空陣列也沒問題。

#### 寫入
* 常見添加新變數寫法有以下3種:
	1. **變數名稱[位置]**
		* 直接指定要在哪個位置加入變數值
		* 如果有跳號的話，中間缺少的值會顯示empty。
		* 要注意的是，如果指定位置本身就有值的話，那個變數則會重新被賦予值一次，意即舊值會被蓋過去。
	2. **變數名稱.push()**
		* ()裡面放要新增的值，新值會被加到串列最後一個位置。
	3. **變數名稱.unshift()**
		* ()裡面放要新增的值，新值會被加到串列第一個位置。
* 範例如下:
![](https://i.imgur.com/T2V2hZV.png)

#### 刪除
* 常見刪除變數寫法有以下3種:
	1. **變數.splice(==值1==, ==值2==)**
		* **值1**: 代表起始位置
		* **值2**: 要往後刪除幾筆資料(++包含自己++)
	3. **變數.pop()**
		* ()裡面不用寫東西，會刪除最後一個變數。
	4. **變數名稱.shift()**
		* ()裡面不用寫東西，會刪除第一個變數。
* 範例如下:
![](https://i.imgur.com/iUkHcm6.png)

### 物件 Object
* 語法: 物件名稱:{'屬性1':'值1','屬性2':'值2',... }
#### 讀取
* `物件名稱.屬性` 
#### 新增
* 同一般賦予值的作法，新增`屬性名稱=新的值`
#### 修改/刪除
* `delete 物件名稱.屬性`

### 陣列+物件
#### General Note
* 陣列可以包物件
* 要選擇陣列中的第幾筆，用中括號[] 
* 要選擇物件裡的屬性，請用點 `.`


