# 變數 var
| 符號 | 功能 | 例子 |
| ---- | ------------------ | ------------------ |
| = | 賦值 | var a = 2 |
| == | 等於 | 2 + 3 == 5 > true |
| !== | 不等於 | 2 * 2 !== 3 > true |
| === | 等於(含型態相等) | 3 === '3' > false |
- 為了避免奇怪的 Bug ,判斷等式時盡量使用 ===
### 變數的命名,基本上有兩種流派。
- var this_is_a_book (底線派)
- var thisIsABook (駝峰派)
- 不可以數字、保留字(程式本身有的命名)、特殊符號,例如:123w、for、int、! 等等。
`var 變數名稱 = 變數內容`
### 變數命名
- 記得培養好好命名的習慣,如果每個變數都只叫 a 或 b ,事後回來看會很難辨別,連自己都搞不清楚。
- 變數名稱大小寫有差別
- 不能用數字開頭,保留字和特殊符號也盡量避免
- undefine 代表有宣告變數,但沒有內容; not define 代表該變數沒有被宣告過。
以下範例
```
var a = 0
a = a + 5
console.log(a)
=> 5
```
`a = a + 5` 可以簡化為 `a += 5`
那 `a += 1` 有其他寫法嗎?
可以寫成 `a++`
有 `a++` 就有 `a--`
那可以寫成 `++a` 嗎?
- 不行,他們是不同意思
先後順序的差異,不要搞混了
```
var a = 0
console.log(a++ && 20)
=> 0 // false
//先執行 console.log(a && 20) 再 a+=1
var a = 0
console.log(++a && 20)
=> 20
//先執行 a+=1 再 console.log(a && 20)
```
前者可以想成
```
console.log(a && 20)
a+=1
```
後者可以想成
```
a+=1
console.log(a && 20)
```
- 指派運算子
| 符號 | 例子 | 實際上在做什麼 |
| ---- | ------- | -------------- |
| += | a += b | a = a + b |
| -= | a -= b | a = a - b |
| * = | a * = b | a = a * b |
| /= | a /= b | a = a / b |
| %= | a %= b | a = a % b |
| ++ | a++ | a = a + 1 |
| -- | a-- | a = a - 1 |
另外 ++a 也代表 a += 1 , --a 也代表 a -= 1 。放前後的差別如下:
```
var a = 0;
console.log(a++ && 30);
// false
console.log(a);
// 1
```
上面例子中, console.log(a++ && 30) 可以解讀成 console.log(a && 30) 然後再 a+=1。
```
var a = 0;
console.log(++a && 30); //先執行 a+=1 再 console.log(a && 30)
// true
console.log(a);
// 1
```
通常一句話中只會有一個 a++ 或 a-- ,才不會有判斷先後順序的問題。
### 變數型態
- 輸入 type (變數名稱) 可以得到變數的型態,型態可以分為以下幾種:

|
### 變數型態 part2
| 型態 | 例子 |
| -------- | ---------------------- |
| boolean | true, false |
| number | 1, 2, 999, -0.5 |
| string | '字串', '100', 'hello' |
| undefine | undefine |
| function | 所有 function |
- Primitive
Booling
Number
String
- Other
undefined
function
object
null === object
```
var student = [];
var peter = {
name: 'peter',
address: 'taipei',
phone: '01877754'
} //name, address, phone 皆為索引值
student.push(peter); //把此 object 加入到 student 陣列裡
console.log(typeof peter); //object
console.log(student[0]); //顯示第 0 位學生的資料
console.log(student[0].name); //顯示第 0 位學生的 name
console.log(peter.name); //指定學生的名字
console.log(peter['name']); //同上,差別在此 [] 裡的內容可替換成別的變數
//例如
var key = 'name';
console.log(peter.key); //undefined
console.log(peter[key]); //peter
//此外物件裡也可以放陣列或再一個物件,甚至 function
var peter = {
name: 'peter',
scores: [80, 50, 45],
phone: '01877754',
father: {
name: 'georgie',
phone: '7804444'
}
}
console.log(peter['scores']); //peter 的分數
console.log(peter.father.name);
console.log(peter['father']['name']); //爸爸的名字
```
## 變數運算注意
型態
相同都是數字型態的變數才能相加,不然結果就只會合體
```
var a = 30;
var b = '20';
var c = 20;
```
```
console.log(a + b); //3020
console.log(a + c); //50
可以使用一些函數將其轉換成數字:
console.log(a + Number(b));
console.log(a + parseInt(b, 10)); //皆可轉成數字型態
parseInt(string, radix); //radix 回傳值表示此數的進位法
parseInt(b, 10); //20
parseInt(b, 2); //4 =>(2*2^1)
```
變數型態part2
```
字串 + 字串,會將字串拼接起來。例如 'hello' + 'world' > 'helloworld'。
數字 + 字串,會將數字轉成字串接起來。例如 10 + '20' > '1020'。
浮點數誤差。因為 JavaScript 儲存小數時並不精準,可能 0.2 其實是 0.2000000004 ,因此小數相加要用其他方法。例如 0.2 + 0.3 === 0.5 > false
```