前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >js基本数据类型 BigInt 和 Number 的区别

js基本数据类型 BigInt 和 Number 的区别

作者头像
吴裕超
发布2019-05-25 17:55:45
6.8K2
发布2019-05-25 17:55:45
举报
文章被收录于专栏:吴裕超吴裕超

今天在做LeetCode的一到 “加一” 的题,题目如下

代码语言:javascript
复制
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:

输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。

我的代码是这样的,这还是优化过的

代码语言:javascript
复制
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
};

后来在答案区看到一位大神的代码只有一行

代码语言:javascript
复制
const plusOne = digits => {
  return (BigInt(digits.join('')) + 1n).toString().split('');
};

赶紧学习一下,

这个方法很巧妙,是把数组转化为数字计算后再转回数组

方法学习到了,但是为什么不能用Number呢,我测试了一下,当数字过大时,Number的问题就出现了

代码语言:javascript
复制
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 的安全整数限制,也可以安全地存储和操作大整数。

chrome 67+开始支持BigInt。可以这样定义一个 BigInt 变量:在一个整数字面量后面加 n,如:10n,或者调用函数BigInt()

要创建一个BigInt,在数字后面添加n后缀即可,例如,123变成123n。全局BigInt(number)函数可以用来将Number转换成BigInt。换句话说,BigInt(123) === 123n

代码语言:javascript
复制
BigInt(value)。   
//  value是创建对象的数值。可以是字符串或者整数。
代码语言:javascript
复制
const theBiggestInt = 9007199254740991n;

const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n

const hugeButString = BigInt('9007199254740991');
// ↪ 9007199254740991n

它在某些方面类似于 Number ,但是也有几个关键的不同点:不能和 Math 对象中的方法一起使用;不能和任何 Number 实例混合运算。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档