8 天重新認識 JS Day 01
紀錄閱讀 “8 天重新認識 JS” Day 01,記錄不太熟的基本知識
變數宣告
- 宣告變數可以不打
var
將被視為全域變數使用(覆蓋)
1 | a = 1 |
如果在全域作用宣告a與b在這個情況下,a與b被視為全域變數被宣告
- 當使用 var 宣告時,變數可以被重新宣告
1 | var a = 1 |
資料型別
- 宣告字串使用
"
或'
都可以,但要使用單引號包裹可以使用跳脫字元\
1 | let a = 'Let\'s GO' |
數字
Number 特殊形態
數字除了常規整數和浮點數,還包含三種特殊數字型態
Infinity
、-Infinity
、NaN
- 正整數/0 會得到
Infinity
- 任何負數/0 會得到
-Infinity
- 0/0、Infinity/Infinity、-Infinity/-Infinity 會得到
NaN
- typeof NaN 會得到 number
- NaN === NaN 會得到 false
通常使用isNaN(value)
來判斷輸入值否為 NaN
0.1 + 0.2 === 0.3 (false)
這是由於在程式世界中計算會將 0.1 轉為二進位時沒辦法完美轉換,只能用無限循環的位數來趨近於十進位的小數
有點像是 Pi 那種無限小數的感覺,導致計算後的 0.3 會有小數變成 0.30000004 ,而得到 false
解決方式有兩種
- 使用
Number.EPSILON
來判斷
1 | // 先使用Math.abs將小數調整為整數在判斷 |
ES6 提供了 Number.EPSILON
最小精度來幫助我們判斷,如果一個數值的誤差小於這個值,那我們就可以認為幾乎沒有誤差了
- 使用套件 number-precision
null、undefined
typeof null === ‘object’ 是陳年 BUG
undefined 在非全域作用域下可以作為變數使用
1 | ( |
也可以做為參數使用
1 | ( |
物件
判斷屬性使否在物件中存在
- 直接存取
但遇到值是undefined
這招就沒用
1 | var obj = {}; |
- 使用
in
、hasOwnProperty()
檢查
1 | var obj = { |
使用 hasOwnProperty()
不會往上檢查物件原型鍊(prototype chain),只會檢查物件本身是否存在這個屬性in
運算子會繼續順著物件原型鍊上做檢查
1 | obj.hasOwnProperty('hasOwnProperty') //false |
陣列
- 陣列長度(length)是可以被覆寫的
1 | var a = ["apple", "bear", "cat"] |
四則運算
加法
1 | Infinity + Infinity //Infinity |
當遇到字串與 number、boolean、object 相加時,會呼叫其原型方法.toString()
轉型後,再進行字串拼接
而 null
、undefined
則透過 JS 的 String()
方法來轉為字串 “null”、”undefined”
1 | 10 + 'abc' //'10abc' |
減法
1 | Infinity - Infinity //NaN |
一般型態
如果 string、boolean、undefined、null 在做減法運算時,若其中一方屬性不是數字,JS 會在背後透過 Number()
嘗試轉型為數字後在進行計算。
1 | 100 - '50' //50 |
物件型態
在物件形態下會透過物件的 valueOf()
方法取的對應值
如果物件沒有 valueOf()
則透過 toString()
轉為字串後再以 Number()
嘗試將數值轉為數字後進行運算
1 | 100 - {} //NaN |
1 | //自訂物件,透過 Object.prototype.valueOf 來指定物件的 value |
乘法/除法
乘法/除法則會將非數字值使用Number()
轉換後在進行計算計算
1 | 100 * "10" //1000 |
取餘數
取餘數則是使用除法運算後取到餘數,在Infinity
狀況下都是NaN,如果遇到一搬數值且除數為Infinity
狀況下,結果則為被除數
1 | Infinity % 0 //NaN |