# JS 學習筆記(1) - 變數與型別
參考資料:
- [重新認識 JavaScript: Day 03 變數與資料型別](https://ithelp.ithome.com.tw/articles/10190873)
- [The Modern JavaScript Tutorial](https://javascript.info/)
- [你有必要知道的25個JavaScript面試題](https://codertw.com/%E5%89%8D%E7%AB%AF%E9%96%8B%E7%99%BC/271415/)
- [JavaScript 熱門面試題](https://hackmd.io/@chupai/r1mW5_gEB?type=view)
- [「2021」高频前端面试题汇总之JavaScript篇(上)](https://juejin.cn/post/6940945178899251230)
可以使用 https://jsbin.com/ruzozuqoma/edit?js,console 練習。
## 變數宣告
### before ES6
使用 `var` 關鍵字做變數宣告。
### after ES6
使用 `var, let, const` 關鍵字做變數宣告。
1. 大部分情況 `var` 和 `let` 可以替換。
2. const(常數)宣告後不可修改。
```javascript=
const pi = 3.14159;
pi = 3; // error, can't reassign the constant!
```
### var & let
1. var 變數沒有塊作用域,如果在函數外部聲明,它們的可見性作用域為當前函數或全局。
2. var 聲明在函數開始時處理(全局變數的腳本開始)。
https://javascript.info/var
:::info
**沒有透過 var/let 宣告的變數自動變為 全域變數**
ex: m = 2
:::
### 命名規範
JavaScript 中的變量名有兩個限制:
1. 名稱只能包含字母、數字或符號$和_。
2. 第一個字符不能是數字。
3. 區分大小寫。
4. 禁止使用關鍵字或保留字做變數名稱。
5. 常數的命名通常為全部大寫。ex: `const COLOR_RED = "#F00";`
```javascript=
var abc;
var Abc;
var $abc;
var _abc;
var 中文變數; // 理論上可行, 但不建議使用
var 1abc; // error
var a-bc; // error
```
關鍵字指的是 ECMAScript 所規定具有特定用途的英文單字,無法用作變數名稱使用,而保留字則是雖然目前在 JavaScript 還沒有特殊用途,但在未來有可能會被拿來當關鍵字來使用,所以也不能作為變數名稱。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords
## 弱型別
JS 為 弱型別語言 => 變數本身其實不帶有資料型別的資訊,其中的「值」或「物件」才有
## 型別類型
ES5.1 JS內建型別主要分成:**基本型別(Primitives)** & **物件型別(Object)**
- 基本型別:`string、number、boolean、null、undefined`
- 除外都歸類於 **物件型別**
使用 `typeof` 運算子可以判斷型別:
```javascript=
typeof true; // 'boolean'
typeof 'Kuro'; // 'string'
typeof 123; // 'number'
typeof { }; // 'object'
typeof [ ]; // 'object'
// 下面兩個要特別注意,之後的篇幅會介紹到
typeof window.alert; // 'function'
typeof null; // 'object'
```
https://262.ecma-international.org/5.1/#sec-11.4.3
### String
1. 單雙引號並無區別,僅須注意開合引號必須一致。
```javascript=
var str = 'Hello';
var str2 = "Single quotes are ok too";
var phrase = `can embed another ${str}`; // 反引號是擴展功能, 可嵌入變數或表達式
var answer = `${1 + 2}`;
```
2. 跳脫字元 `\`
```javascript=
// error
var str = 'It's a dog';
// 可寫成
var str2 = "It's a dog";
var str3 = 'It\'s a dog';
```
3. 字串連接
```javascript=
var str = 'Hello' + ',World';
```
### Number
JS中數字型別無論是整數還是浮點數都是 `number`
```javascript=
console.log(typeof 10); // "number"
console.log(typeof 12.34); // "number"
```
還有 Infinity , -Infinity , NaN(非數值, Not a Number)
- Infinity:正數除以 0
- -Infinity:負數除以 0
- NaN:0/0 , Infinity/Infinity , -Infinity/-Infinity
但是
```javascript=
console.log(typeof NaN); // number
```
判斷是否為 `NaN`
```javascript=
console.log(isNaN(NaN)); // true
```
### Boolean
值分為:true, false 兩種
```javascript=
var a = true;
var b = false;
if(a) {
//...
}
```
### null & undefined
- null:此變數沒有值
- undefined:尚未給值,未定義
```javascript=
var a; // undefined
var b = null; // null
```
## 概括
JavaScript 中有 8 種基本資料型別:
* number 對於任何類型的數字:整數或浮點數,整數受 限制。±(253-1)
* bigint 用於任意長度的整數。
* string 對於字符串。一個字符串可能有零個或多個字符,沒有單獨的單字符類型。
* boolean 為true/ false。
* null 對於未知值 - 具有單個值的獨立類型null。
* undefined 對於未分配的值——具有單個值的獨立類型undefined。
* object 用於更複雜的數據結構。
* symbol 用於唯一標識符。
`typeof` 運算符允許我們查看存儲在變數中的型別。
* 兩種形式:`typeof x` 或`typeof(x)`。
* 返回帶有類型名稱的字符串,例如"string"。
* 對於null返回"object"——這是語言中的一個錯誤,它實際上不是一個 object。