2023年1月16日 星期一

關於 BigInt 搭配運算子時的注意事項

 關於 BigInt 搭配運算子時的注意事項

前言

  在先前的 關於 BigInt 裡基本使用了 BigInt ,最近發現它可以搭配運算子來使用,在此把學習的過程做個紀錄。


內容

  範例如下

console.log( (10n + 3n).toString() );//13
console.log( (10n - 3n).toString() );//7
console.log( (10n * 3n).toString() );//30
console.log( (10n / 3n).toString() );//3
//It can't operator with Number
//console.log( (10n / 3).toString() );//Thtis has error!
//
//This equal 10n.toString() + '3'
console.log( 10n + '3' );//103
console.log( '3' + 10n );//310


範例的開頭對 BigInt 進行了加減乘除,結果如預期,要注意除法會只取整數,畢竟 BigInt 不支援小數,不幸的搭配 Number 來使用是不支援的,搭配 String 來使用時並不是運算的加法,而是將字串串接在一起,注意到範例在運算完後都不需要 toString() ,因為加法完成後的型別一定是 String ,不論加法的順序,這點要注意。


參考資料

[ developer.mozilla.org ] BigInt


相關文章與資料

關於 BigInt

2023年1月9日 星期一

關於 BigInt

 關於 BigInt

前言

  最近發現 BigInt 這個型別,抽個空做個學習,在此做個紀錄。


內容

  BigInt 是 JavaScript 用來支援位數很多的整數的方案,它比 Number 還要能處理更多的整數,但不能處理小數,範例如下

console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
//
let num = 1234567890123456789 * 123;
let bigNum = 1234567890123456789n * 123n;
console.log(  num );//151851850485185200000
console.log(  Number.isFinite(num) );
console.log(  bigNum.toString() );//"151851850485185185047"


範例開頭先印出了 Number 的最大整數與負最大整數,接著用 Number 與 BigInt 來示範超出 Number 最大後會發生什麼事,如果要將一串數字轉成  BigInt 的話只要在數字的最後加上"n"就會變成 BigInt , Number 雖然可以正常印出數值,但其實數值是錯的!利用 Number.isFinite() 來檢查發現不會變成"false",所以 JavaScript 並不會在超出最大述職時直接變成無限大,最後 BigInt 並不能直接做列印,要透過 BigInt.toString() 才能列印數值,這點要注意。


參考資料

[ developer.mozilla.org ] BigInt


相關文章與資料

關於 Number.isFinite()

2023年1月2日 星期一

關於 Number.isFinite()

 關於 Number.isFinite()

前言

  最近發現在做除法時發現 JavaScript 的行為跟我想得不太一樣,在此把學習的過程做個紀錄。


內容

  由於我是先學 C++ ,所以理所當然地認為"除零"是絕對不可以做的事,不然程式直接中斷,但最近發現 JavaScript 在"除零"遽然不會發生任何中斷,也不會報任何的錯誤,來看以下範例

console.log( 1 / 0 );//Infinity
console.log( Infinity );//Infinity
console.log( 0 / 0 );//NaN
console.log( Number.isFinite(1 / 0) );//false


範例開頭做出一個"除零"的動作,結果會顯示"Infinity",查了一下發現"Infinity"是 JavaScript 預設的參數,最意外的行為是第 3 個 ,零除零並不會得到 "Infinity" ,而是"NaN",最後如果要判斷是否超出值域可以使用 Number.isFinite() 。


參考資料

[ developer.mozilla.org ] Number.isFinite()

2022年12月26日 星期一

關於 Number.toFixed()

 關於 Number.toFixed()

前言

  最近發現 JavaScript 可以透過 Number.toFixed() 來取得精度修正後的字串,在此把學習的過程做個紀錄。


內容

  範例如下

const numObj = 12345.6489;
console.log( Math.round(numObj * 10) / 10  );//12345.6
console.log( numObj.toFixed(1) );//"12345.6"
console.log( numObj.toFixed(2) );//"12345.65"
console.log( numObj.toFixed(8) );//"12345.64890000"
console.log( Number.parseFloat( numObj.toFixed(2) ) );//12345.65


範例開頭示範用 Math.round() 來完成精度修正,也是我一直以來用的方法,接著用 Number.toFixed() 來修正精度,引數代表的是修正精度的位數,範例第三次使用 Number.toFixed() 使用時會用超出位數的方式來修正,會發現結果是把多餘的位數補零,最後要注意 Number.toFixed() 回傳的是字串,而不是 Number ,如果要得到 Number 的結果就要再透過 Number.parseFloat() 來取得。


參考資料

[ developer.mozilla.org ] Number.prototype.toFixed()

2022年12月19日 星期一

關於 String.charCodeAt()

 關於 String.charCodeAt()

前言

  JavaScript 有辦法直接取得 unicode 的數值嗎?答案是可行的,透過 String.charCodeAt() 即可,在此把學習的過程做個紀錄。


內容

  範例如下

function getUniCodeString( code ){
  return code.toString(16).padStart( 4,'0');
}
let str = "許功ABC";
console.log( getUniCodeString(str.charCodeAt(0) ) );//8a31
console.log( getUniCodeString(str.charCodeAt(1) ) );//529f
console.log( getUniCodeString(str.charCodeAt(2) ) );//0041


範例的開始有個 getUniCodeString() ,作用是把 unicode 的數字轉乘 16 進制的字串,接著就可以透過 charCodeAt() ,來取得 unicode ,引數識字元的索引,可以看到範例是範例分別對開頭的 3 個字元進行取得。 getUniCodeString() 的最後會透過 String.padStart() 強制把顯示的位數補正成 4 ,這樣可以方便做查詢。


參考資料

[ developer.mozilla.org ] String.prototype.charCodeAt()

2022年12月12日 星期一

關於 String.padStart() 與 String.padEnd()

 關於 String.padStart() 與 String.padEnd()

前言

  最近發現 String.padStart() 與 String.padEnd() ,抽個空作個學習,在此做個紀錄。


內容

  String.padStart() 與 String.padEnd() 的功能都是填充字串,一個填充在字首,另一個則在字尾,範例如下

const str1 = '5';

console.log(str1.padStart(1, '01'));//5
console.log(str1.padStart(2, '01'));//05
console.log(str1.padStart(3, '01'));//015
console.log(str1.padStart(6, '01'));//010105
//
console.log(str1.padEnd(1, '01'));//5
console.log(str1.padEnd(2, '01'));//50
console.log(str1.padEnd(3, '01'));//501
console.log(str1.padEnd(6, '01'));//501010


這兩個 Function 的參數都是兩個,第一個是"目標字串長度",第二個則是要填充的字串,範例的第一個都是字串長度"1",而原本字串的長度也是"1",所以不會填充任何字串,接著把"目標字串長度"變成"2"會如何?以 String.padStart()  來說會得到"05",開頭的"0",其實是要填充的字串的第一個字元,接著長度調成"3",就會得到"015",就剛好是要填充的字串加原本的字串,最後把長度調成"6"會怎麼樣呢?會得到"010105",會看到要填充的字串開始重複, String.padEnd() 的行為與 String.padStart() 一樣,只是將字串填到字尾而已。


參考資料

[ developer.mozilla.org ] String.prototype.padStart()

[ developer.mozilla.org ] String.prototype.padEnd()

2022年12月5日 星期一

關於 String.endsWith()

 關於 String.endsWith()

前言

  最近發現 String.endsWith() ,抽個空做個學習,在此做個紀錄。


內容

  範例如下

const str1 = 'Hello world';

console.log(str1.endsWith('world'));//true
//
const str2 = 'How are you?';
console.log(str2.endsWith('you'));//false
console.log(str2.endsWith('you',str2.length - 1));//true
//check end of string use regex
const reg = /you[?]$/g;
console.log( reg.test(str2) );//true


String.endsWith() 的功能就是檢查字串結尾有否是某個指定字串,範例的第一次應用直接檢查字串的結尾是否是 'world',然後他有第二個參數可以輸入,第二個參數是個很不直覺的參數,意思是要檢查的字串長度,如果不輸入時,可以直接想像就是輸入 String.length ,就像第二次應用的開頭一樣,結果會得到 false 是因為結尾應該是有 '?' 的,所以接著透過第二個參數來少檢查一個字元就可以得到 true ,最後範例透過正則表達式來檢查結尾。這個 function 其實可以被正則表達式完全替代,但前提是要先習慣用正則表達式。


參考資料

[ developer.mozilla.org ] String.prototype.endsWith()