zoukankan      html  css  js  c++  java
  • JavaScript:如何理解BigInt类型?

    如何理解BigInt?

    BigInt是一种新的数据类型,用于当整数值大于Number数据类型支持的范围时。这种数据类型允许我们安全地对大整数执行算术操作,表示高分辨率的时间戳,使用大整数id,等等,而不需要使用库。

    为什么需要BigInt?

    在JS中,所有的数字都以双精度64位浮点格式表示,那这会带来什么问题呢?
    这导致JS中的Number无法精确表示非常大的整数,它会将非常大的整数四舍五入,确切地说,JS中的Number类型只能安全地表示-9007199254740991(-(253-1))和9007199254740991((253-1)),任何超出此范围的整数值都可能失去精度。

    console.log(999999999999999);  //=>10000000000000000
    

    同时也会有一定的安全性问题:

    9007199254740992 === 9007199254740993;    // → true 居然是true!
    

    如何创建并使用BigInt?

    要创建BigInt,只需要在数字末尾追加n即可。

    console.log( 9007199254740995n );    // → 9007199254740995n	
    console.log( 9007199254740995 );     // → 9007199254740996
    

    另一种创建BigInt的方法是用BigInt()构造函数

    BigInt("9007199254740995");    // → 9007199254740995n
    

    简单使用如下:

    10n + 20n;    // → 30n	
    10n - 20n;    // → -10n	
    +10n;         // → TypeError: Cannot convert a BigInt value to a number	
    -10n;         // → -10n	
    10n * 20n;    // → 200n	
    20n / 10n;    // → 2n	
    23n % 10n;    // → 3n	
    10n ** 3n;    // → 1000n	
    
    const x = 10n;	
    ++x;          // → 11n	
    --x;          // → 9n
    console.log(typeof x);   //"bigint"
    

    值得警惕的点

    1.BigInt不支持一元加号运算符, 这可能是某些程序可能依赖于 + 始终生成 Number 的不变量,或者抛出异常。另外,更改 + 的行为也会破坏 asm.js代码。

    2.因为隐式类型转换可能丢失信息,所以不允许在bigint和 Number 之间进行混合操作。当混合使用大整数和浮点数时,结果值可能无法由BigInt或Number精确表示。

    10 + 10n;    // → TypeError
    

    3.不能将BigInt传递给Web api和内置的 JS 函数,这些函数需要一个 Number 类型的数字。尝试这样做会报TypeError错误。

    Math.max(2n, 4n, 6n);    // → TypeError
    

    4.当 Boolean 类型与 BigInt 类型相遇时,BigInt的处理方式与Number类似,换句话说,只要不是0n,BigInt就被视为truthy的值。

    if(0n){//条件判断为false
    
    }
    if(3n){//条件为true
    
    }
    

    5.元素都为BigInt的数组可以进行sort。
    6.BigInt可以正常地进行位运算,如|、&、<<、>>和^

    浏览器兼容性

    caniuse的结果:
    {{uploading-image-170815.png(uploading...)}}
    其实现在的兼容性并不怎么好,只有chrome67、firefox、Opera这些主流实现,要正式成为规范,其实还有很长的路要走。

    我们期待BigInt的光明前途!

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Spring的注解配置与XML配置之间的比较
    为何注释中要加入注解
    语法的二义性和token的超前扫描
    基于EBNF语法的描述
    JavaCC从入门到出门
    Golang 微信机器人包
    Golang 笔记 5 go语句
    Golang 笔记 4 defer、error、panic
    Golang 笔记 3 if、switch、for、select语句
    Golang 笔记 2 函数、结构体、接口、指针
  • 原文地址:https://www.cnblogs.com/XF-eng/p/15067446.html
Copyright © 2011-2022 走看看