今天在作LeetCode的一到 「加一」 的題,題目以下git
給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。 最高位數字存放在數組的首位, 數組中每一個元素只存儲一個數字。 你能夠假設除了整數 0 以外,這個整數不會以零開頭。 示例 1: 輸入: [1,2,3] 輸出: [1,2,4] 解釋: 輸入數組表示數字 123。 示例 2: 輸入: [4,3,2,1] 輸出: [4,3,2,2] 解釋: 輸入數組表示數字 4321。
個人代碼是這樣的,這仍是優化過的chrome
var plusOne = function(digits) { for (let i = digits.length - 1; i >= 0; i--) { if (digits[i] === 9) { digits[i] = 0 } else { digits[i]++ break } } return (digits[0] === 0) ? [...[1], ...digits] : digits };
後來在答案區看到一位大神的代碼只有一行數組
const plusOne = digits => { return (BigInt(digits.join('')) + 1n).toString().split(''); };
趕忙學習一下,安全
這個方法很巧妙,是把數組轉化爲數字計算後再轉回數組函數
方法學習到了,可是爲何不能用Number呢,我測試了一下,當數字過大時,Number的問題就出現了學習
var plusOne1 = function(digits) { (Number(digits.join(''))+1).toString().split('') return digits }; var plusOne2 = digits => { return (BigInt(digits.join('')) + 1n).toString().split(''); }; plusOne1([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3]) // [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,0,0,0] plusOne2([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3]) // [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,4] 再來下面的就更清晰了 Number([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3].join('')) = 6145390195186705000 BigInt([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3].join('')) = 6145390195186705543n
爲何Number不行,BigInt就能夠呢,咱們來看一下BigInt的介紹測試
在JavaScript中的基本數據類Number是雙精度浮點數,它能夠表示的最大安全範圍是正負9007199254740991,也就是2的53次方減一, 比253大的全部數字則可使用BigInt
表達。優化
BigInt
是JavaScript中的一個新的原始類型,能夠用任意精度表示整數。使用BigInt
,即便超出JavaScript Number
的安全整數限制,也能夠安全地存儲和操做大整數。spa
chrome 67+開始支持BigInt。能夠這樣定義一個 BigInt
變量:在一個整數字面量後面加 n
,如:10n
,或者調用函數BigInt()
。code
要建立一個BigInt
,在數字後面添加n後綴便可,例如,123
變成123n
。全局BigInt(number)
函數能夠用來將Number轉換成BigInt
。換句話說,BigInt(123) === 123n
。
BigInt(value)。 // value是建立對象的數值。能夠是字符串或者整數。
const theBiggestInt = 9007199254740991n; const alsoHuge = BigInt(9007199254740991); // ↪ 9007199254740991n const hugeButString = BigInt('9007199254740991'); // ↪ 9007199254740991n
它在某些方面相似於 Number
,可是也有幾個關鍵的不一樣點:不能和 Math
對象中的方法一塊兒使用;不能和任何 Number
實例混合運算。
好了,如今你知道他們的區別在哪裏了嗎?若是工做中有對超大數字的計算,必定記得使用BigInt確保準確無誤哦!