# 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。