JavaScript 數字特性
- 是 64 位元的浮點數(2 進位編碼)
- 1 與 1.0 指的是相同的資料類型與值
|
|
- 二進位編碼只能精確地表示位數有限且分母是 2 的倍數的小數(0.5、0.125)
|
|
- 可以使用 BigDecimal.js 或 decimal.js 等函式庫
字串轉數字
Number
|
|
+
運算子
- 是 Number() 的簡寫
|
|
字串轉數字
Number.parseInt(string[, radix])
- 此方法跟全局 parseInt()一樣
- 若傳入參數不是字串的話,會先將其轉成字串(相當於先執行 ToString 再執行 parseInt)
- 由左至右掃描,空白值會被忽略,遇到非數值字元,就不再進行下去,回傳已經轉好的部分
- 若整個字串都是非數值,回傳 NaN。
- 第二個參數為進位數,強烈建議填寫好進位參數避免非預期 bug,進位數從 2 到 36,能代表該進位系統的數字。如果沒有指定 radix 的話,給出的結果會按照實做不同而異,通常預設值不是 10 進位,
|
|
NaN 系列
何時出現 NaN (Not a Number)
- NaN 是一個 Number 型態但強制轉成數字後無法用任何數字表現的結果
- NaN 不等於 NaN,NaN !== NaN // true
- 回傳未定義 not defined
- 超出範圍
- 運算式有一個參數是 NaN
isNaN()
- 過往判斷 NaN 習慣用 isNaN(因為 NaN !== NaN),但有些缺點,遇到非數字會強制轉型,容易出現非預期的狀況
|
|
Number.isNaN()
- 檢查是否為 NaN,回傳布林值 注意不是非數字回傳 true,而是 NaN 回傳 true
- 使用 Number.isNaN 回傳結果則單純續多
|
|
Number.isFinite()
- 適合確認是否為數字
|
|
Number.isInteger()
- 適合確認是否為整數
|
|
Math 運算系列/取整數/餘數
Math.sqrt()
- 開根號
|
|
Math.max()、Math.min()
- 找最大值、最小值
|
|
圓周率 Pi
|
|
Math.random()
- 隨機產生 0~1 的小數,不包含 1
|
|
Math.trunc()
- 去掉小數
|
|
Math.round()
- 四捨五入
|
|
Math.ceil()
- 無條件往更大的值取整數
|
|
Math.floor()
- 無條件往更小的值取整數
- 正數時跟 Math.trunc() 結果一樣,負數則不同
|
|
~~
- ~~ 將浮點數轉為整數,其運作方式為反轉兩次而得到 Math.trunc()的結果
|
|
Number.prototype.toFixed()
- 使用定點小數表示法(fixed-point notation)來格式化數字。
|
|
餘數運算子 %
- 可以處理表格變色
|
|
數字分隔符 Numeric Separators
- 一樣的值,透過底線分割提高可讀性
- Number()無法解析含有數字分隔的的數字,這個只適合用於手動建立的參數,而非 API 回傳字串類型的數字
|
|
- 小數點
|
|
BigInt
- 用來儲存更大的數字,因為一個數字能使用的記憶體有限
- JavaScript 可以呈現的最大值是 9007199254740991,即(2 ** 53 - 1),超過這個數字無法往上加
- 數字後面寫 n,或用 BigInt 包裹後會變成 BigInt
|
|
BigInt 運算
- 用 n 的形式無法跟其他數字相加,BigInt 只能跟 BigInt 運算
- 若 BitInt+d 字串,BitInt 一樣會轉成字串
|
|
- 判斷運算子> < =,用 n 的形式沒問題
|
|
建立日期時間物件
Date.now()
- 回傳自 1970 年 1 月 1 日 00:00:00 (UTC) 到當前時間的毫秒數
- Date.now() 的精度可能受到瀏覽器影響被取整數
|
|
new Date() 4 種建立方式
- new Date(): 不傳入任務參數到建構子,會依系統設定建立出代表當下時間的 Date 物件
|
|
- new Date(value): value 是自世界標準時間(UTC) 1970 年 1 月 1 日 00:00:00 開始的毫秒整數值(注意:Unix timestamp 是以秒而非毫秒為單位)
|
|
- new Date(dateString): 表示日期時間物件的字串。這個字串應該要能被 Date.parse() (en-US) 方法解析
- new Date(“yyyy-mm-dd hh:mm:ss”) 符合所有瀏覽器格式
|
|
- new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);
- 傳入至少兩個參數,缺少日的話會設為 1,其它參數則會被設定為 0。
- 備註:當傳入超過一個參數,且參數值超過它的合理範圍(例如:傳數值 13 到月份,或傳數值 70 給分鐘),相鄰的參數值將會被調整。例如: new Date(2013, 13, 1) 將等同於 new Date(2014, 1, 1) 都會建立代表 2014-02-01 的物件
|
|
取得日期時間物件的值
- getFullYear(): 年
- getMonth(): 月
- getDate(): 日
- getHours(): 時
- getMinutes(): 分
- getSeconds(): 秒
|
|
修改日期時間物件的值
- 如果設定的 value 超出了合理範圍,會相對應的往前或往後推算
- setFullYear(): 年
- setMonth(): 月
- setDate(): 日
- setHours(): 時
- setMinutes(): 分
- setSeconds(): 秒
|
|
時間轉字串 .toISOString()
- 時區以 UTC 0 為起點
|
|
時間轉毫秒
- 回傳距離 1970 年 1 月 1 日 0 時 0 分 0 秒(UTC 時間)多久的毫秒數
|
|
時間的運算
- 會先轉換成 Time Stamp 毫秒為單位
|
|
日期時間/數字格式化 Internationalization API
日期時間 Intl. DateTimeFormat()
- options Optional 可以使用選填項目: “full”、“long”、“medium”、“short”
- 年可以寫"numeric" (e.g., 2012)、“2-digit” (e.g., 12)
- 月可以寫"numeric" (e.g., 3)、“2-digit” (e.g., 03)、“long” (e.g., March)、“short” (e.g., Mar)、“narrow” (e.g., M)
- 日可以寫"numeric" (e.g., 1)、“2-digit” (e.g., 01)
- 時可以寫"numeric"、“2-digit”
- 分可以寫"numeric"、“2-digit”
- 秒可以寫"numeric"、“2-digit”
|
|
- 簡單格式化寫法
|
|
數字格式化 Intl. NumberFormat()
- style 可以處理種類 e.g. 距離、溫度、貨幣、百分比
- unit 可以處理對應單位
- useGrouping 處理是否需要, 分隔符
|
|
計時器 setTimeout(), setInterval()
setTimeout()
- var timeoutID = setTimeout(function[, delay, arg1, arg2, …])
- function:delay 毫秒之後執行的函式
- delay: 延遲多少毫秒執行
- 時間到期後傳的參數
- return 值為一個正整數,傳此數值到 clearTimeout()可拿掉定時器
|
|
setInterval()
- setInterval()和 setTimeout()共享同一个 ID 池
- setInterval()搭配 clearInterval()使用,setTimeout 搭配 clearTimeout()使用避免 TimeId 管理混亂
|
|
自動登出
|
|
以上為The Complete JavaScript Course - From Zero to Expert的小筆記,附上連結推推這堂課