今天在作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确保准确无误哦!