成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS最新基本數(shù)據(jù)類型:BigInt

lwx12525 / 1647人閱讀

摘要:意外四舍五入會(huì)損害程序的可靠性和安全性。下面是一些例子構(gòu)造函數(shù)與其他基本類型一樣,可以使用構(gòu)造函數(shù)創(chuàng)建??偨Y(jié)是一種新的數(shù)據(jù)類型,用于當(dāng)整數(shù)值大于數(shù)據(jù)類型支持的范圍時(shí)。

為了保證的可讀性,本文采用意譯而非直譯。

想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你!

BigInt數(shù)據(jù)類型的目的是比Number數(shù)據(jù)類型支持的范圍更大的整數(shù)值。在對(duì)大整數(shù)執(zhí)行數(shù)學(xué)運(yùn)算時(shí),以任意精度表示整數(shù)的能力尤為重要。使用BigInt,整數(shù)溢出將不再是問(wèn)題。

此外,可以安全地使用更加準(zhǔn)確時(shí)間戳,大整數(shù)ID等,而無(wú)需使用變通方法。 BigInt目前是第3階段提案, 一旦添加到規(guī)范中,它就是JS 第二個(gè)數(shù)字?jǐn)?shù)據(jù)類型,也將是 JS 第8種基本數(shù)據(jù)類型:

Boolean

Null

Undefined

Number

BigInt

String

Symbol

Object

在本文中,咱們將詳細(xì)介紹BigInt,看看它如何解決使用Number類型的限制。

問(wèn)題

對(duì)于學(xué)過(guò)其他語(yǔ)言的程序員來(lái)說(shuō),JS中缺少顯式整數(shù)類型常常令人困惑。許多編程語(yǔ)言支持多種數(shù)字類型,如浮點(diǎn)型、雙精度型、整數(shù)型和雙精度型,但JS卻不是這樣。在JS中,按照IEEE 754-2008標(biāo)準(zhǔn)的定義,所有數(shù)字都以雙精度64位浮點(diǎn)格式表示。

在此標(biāo)準(zhǔn)下,無(wú)法精確表示的非常大的整數(shù)將自動(dòng)四舍五入。確切地說(shuō),JS 中的Number類型只能安全地表示-9007199254740991 (-(2^53-1))9007199254740991(2^53-1)之間的整數(shù),任何超出此范圍的整數(shù)值都可能失去精度。

console.log(9999999999999999);    // → 10000000000000000

該整數(shù)大于JS Number 類型所能表示的最大整數(shù),因此,它被四舍五入的。意外四舍五入會(huì)損害程序的可靠性和安全性。這是另一個(gè)例子:

// 注意最后一位的數(shù)字
9007199254740992 === 9007199254740993;    // → true

JS 提供Number.MAX_SAFE_INTEGER常量來(lái)表示 最大安全整數(shù),Number.MIN_SAFE_INTEGER常量表示最小安全整數(shù):

const minInt = Number.MIN_SAFE_INTEGER;

console.log(minInt);         // → -9007199254740991

console.log(minInt - 5);     // → -9007199254740996

// notice how this outputs the same value as above
console.log(minInt - 4);     // → -9007199254740996
解決方案

為了解決這些限制,一些JS開發(fā)人員使用字符串類型表示大整數(shù)。 例如,Twitter API 在使用 JSON 進(jìn)行響應(yīng)時(shí)會(huì)向?qū)ο筇砑幼址姹镜?ID。 此外,還開發(fā)了許多庫(kù),例如 bignumber.js,以便更容易地處理大整數(shù)。

使用BigInt,應(yīng)用程序不再需要變通方法或庫(kù)來(lái)安全地表示Number.MAX_SAFE_INTEGERNumber.Min_SAFE_INTEGER之外的整數(shù)。 現(xiàn)在可以在標(biāo)準(zhǔn)JS中執(zhí)行對(duì)大整數(shù)的算術(shù)運(yùn)算,而不會(huì)有精度損失的風(fēng)險(xiǎn)。

要?jiǎng)?chuàng)建BigInt,只需在整數(shù)的末尾追加n即可。比較:

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

或者,可以調(diào)用BigInt()構(gòu)造函數(shù)

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

BigInt文字也可以用二進(jìn)制、八進(jìn)制或十六進(jìn)制表示

// binary
console.log(0b100000000000000000000000000000000000000000000000000011n);
// → 9007199254740995n

// hex
console.log(0x20000000000003n);
// → 9007199254740995n

// octal
console.log(0o400000000000000003n);
// → 9007199254740995n

// note that legacy octal syntax is not supported
console.log(0400000000000000003n);
// → SyntaxError

請(qǐng)記住,不能使用嚴(yán)格相等運(yùn)算符將BigInt與常規(guī)數(shù)字進(jìn)行比較,因?yàn)樗鼈兊念愋筒煌?/p>

console.log(10n === 10);    // → false

console.log(typeof 10n);    // → bigint
console.log(typeof 10);     // → number

相反,可以使用等號(hào)運(yùn)算符,它在處理操作數(shù)之前執(zhí)行隱式類型轉(zhuǎn)換

console.log(10n == 10);    // → true

除一元加號(hào)(+)運(yùn)算符外,所有算術(shù)運(yùn)算符都可用于BigInt

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

不支持一元加號(hào)(+)運(yùn)算符的原因是某些程序可能依賴于+始終生成Number的不變量,或者拋出異常。 更改+的行為也會(huì)破壞asm.js代碼。

當(dāng)然,與BigInt操作數(shù)一起使用時(shí),算術(shù)運(yùn)算符應(yīng)該返回BigInt值。因此,除法(/)運(yùn)算符的結(jié)果會(huì)自動(dòng)向下舍入到最接近的整數(shù)。例如:

25 / 10;      // → 2.5
25n / 10n;    // → 2n

隱式類型轉(zhuǎn)換

因?yàn)殡[式類型轉(zhuǎn)換可能丟失信息,所以不允許在bigintNumber 之間進(jìn)行混合操作。當(dāng)混合使用大整數(shù)和浮點(diǎn)數(shù)時(shí),結(jié)果值可能無(wú)法由BigIntNumber精確表示。思考下面的例子:

(9007199254740992n + 1n) + 0.5

這個(gè)表達(dá)式的結(jié)果超出了BigIntNumber的范圍。小數(shù)部分的Number不能精確地轉(zhuǎn)換為BigInt。大于2^53BigInt不能準(zhǔn)確地轉(zhuǎn)換為數(shù)字。

由于這個(gè)限制,不可能對(duì)混合使用NumberBigInt操作數(shù)執(zhí)行算術(shù)操作。還不能將BigInt傳遞給Web api和內(nèi)置的 JS 函數(shù),這些函數(shù)需要一個(gè) Number 類型的數(shù)字。嘗試這樣做會(huì)報(bào)TypeError錯(cuò)誤

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

請(qǐng)注意,關(guān)系運(yùn)算符不遵循此規(guī)則,如下例所示:

10n > 5;    // → true

如果希望使用BigIntNumber執(zhí)行算術(shù)計(jì)算,首先需要確定應(yīng)該在哪個(gè)類型中執(zhí)行該操作。為此,只需通過(guò)調(diào)用Number()BigInt()來(lái)轉(zhuǎn)換操作數(shù):

BigInt(10) + 10n;    // → 20n
// or
10 + Number(10n);    // → 20

當(dāng) Boolean 類型與BigInt 類型相遇時(shí),BigInt的處理方式與Number類似,換句話說(shuō),只要不是0n,BigInt就被視為truthy的值:

if (5n) {
    // 這里代碼塊將被執(zhí)行
}

if (0n) {
    // 這里代碼塊不會(huì)執(zhí)行
}

排序BigIntsNumbers數(shù)組時(shí),不會(huì)發(fā)生隱式類型轉(zhuǎn)換:

const arr = [3n, 4, 2, 1n, 0, -1n];

arr.sort();    // → [-1n, 0, 1n, 2, 3n, 4]

位操作符如|、&、<<、>>^對(duì)Bigint的操作方式與Number類似。下面是一些例子

90 | 115;      // → 123
90n | 115n;    // → 123n
90n | 115;     // → TypeError
BigInt構(gòu)造函數(shù)

與其他基本類型一樣,可以使用構(gòu)造函數(shù)創(chuàng)建BigInt。傳遞給BigInt()的參數(shù)將自動(dòng)轉(zhuǎn)換為BigInt:

BigInt("10");    // → 10n
BigInt(10);      // → 10n
BigInt(true);    // → 1n

無(wú)法轉(zhuǎn)換的數(shù)據(jù)類型和值會(huì)引發(fā)異常:

BigInt(10.2);     // → RangeError
BigInt(null);     // → TypeError
BigInt("abc");    // → SyntaxError

可以直接對(duì)使用構(gòu)造函數(shù)創(chuàng)建的BigInt執(zhí)行算術(shù)操作

BigInt(10) * 10n;    // → 100n

使用嚴(yán)格相等運(yùn)算符的操作數(shù)時(shí),使用構(gòu)造函數(shù)創(chuàng)建的Bigint與常規(guī)Bigint的處理方式類似

BigInt(true) === 1n;    // → true
庫(kù)函數(shù)

在撰寫本文時(shí),Chrome +67Opera +54完全支持BigInt數(shù)據(jù)類型。不幸的是,EdgeSafari還沒有實(shí)現(xiàn)它。Firefox默認(rèn)不支持BigInt,但是可以在about:config中將javascript.options.bigint 設(shè)置為true來(lái)開啟它,最新支持的情況可在“Can I use”上查看。

不幸的是,轉(zhuǎn)換BigInt是一個(gè)極其復(fù)雜的過(guò)程,這會(huì)導(dǎo)致嚴(yán)重的運(yùn)行時(shí)性能損失。直接polyfill BigInt也是不可能的,因?yàn)樵撎嶙h改變了幾個(gè)現(xiàn)有操作符的行為。目前,更好的選擇是使用JSBI庫(kù),它是BigInt提案的純JS實(shí)現(xiàn)。

這個(gè)庫(kù)提供了一個(gè)與原生BigInt行為完全相同的API。下面是如何使用JSBI:

import JSBI from "./jsbi.mjs";

const b1 = JSBI.BigInt(Number.MAX_SAFE_INTEGER);
const b2 = JSBI.BigInt("10");

const result = JSBI.add(b1, b2);

console.log(String(result));    // → "9007199254741001"

使用JSBI的一個(gè)優(yōu)點(diǎn)是,一旦瀏覽器支持,就不需要重寫代碼。 相反,可以使用babel插件自動(dòng)將JSBI代碼編譯為原生 BigInt代碼。

總結(jié)

BigInt是一種新的數(shù)據(jù)類型,用于當(dāng)整數(shù)值大于Number數(shù)據(jù)類型支持的范圍時(shí)。這種數(shù)據(jù)類型允許我們安全地對(duì)大整數(shù)執(zhí)行算術(shù)操作,表示高分辨率的時(shí)間戳,使用大整數(shù)id,等等,而不需要使用庫(kù)。

重要的是要記住,不能使用NumberBigInt操作數(shù)的混合執(zhí)行算術(shù)運(yùn)算,需要通過(guò)顯式轉(zhuǎn)換其中的一種類型。 此外,出于兼容性原因,不允許在BigInt上使用一元加號(hào)(+)運(yùn)算符。

交流

干貨系列文章匯總?cè)缦拢X得不錯(cuò)點(diǎn)個(gè)Star,歡迎 加群 互相學(xué)習(xí)。

https://github.com/qq44924588...

我是小智,公眾號(hào)「大遷世界」作者,對(duì)前端技術(shù)保持學(xué)習(xí)愛好者。我會(huì)經(jīng)常分享自己所學(xué)所看的干貨,在進(jìn)階的路上,共勉!

關(guān)注公眾號(hào),后臺(tái)回復(fù)福利,即可看到福利,你懂的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106151.html

相關(guān)文章

  • 如何向 ArrayBuffer 寫入 Uint64 數(shù)據(jù)

    摘要:由于這個(gè)原因,在一些需要更精確運(yùn)算的應(yīng)用場(chǎng)景中,精度就不夠了,例如需要把位數(shù)字寫入到數(shù)組中。但是這又如何在中讀寫位數(shù)據(jù)操作中位數(shù)據(jù)的方案寫一個(gè),在項(xiàng)目中引入,以下例子為使用方式與類似使用的得出的結(jié)果應(yīng)該與原生方法保持一致的。 JS 的 Uint53 JS 的 Number 精度只有 「-2^52 ~ 2^52 - 1」,可以通過(guò) Number.MAX_SAFE_INTEGER 查看 J...

    ad6623 評(píng)論0 收藏0
  • 每日前端進(jìn)階第二題:JS基本數(shù)據(jù)類型有哪幾種?null 是對(duì)象嗎?基本數(shù)據(jù)和復(fù)雜數(shù)據(jù)類型有什么區(qū)別

    摘要:作者陳大魚頭鏈接背景最近高級(jí)前端工程師劉小夕在上開了個(gè)每個(gè)工作日布一個(gè)前端相關(guān)題的,懷著學(xué)習(xí)的心態(tài)我也參與其中,以下為我的回答,如果有不對(duì)的地方,非常歡迎各位指出。 作者:陳大魚頭 github: KRISACHAN 鏈接:github.com/YvetteLau/S… 背景:最近高級(jí)前端工程師 劉小夕 在 github 上開了個(gè)每個(gè)工作日布一個(gè)前端相關(guān)題的 repo,懷著學(xué)習(xí)的心態(tài)我也參...

    Render 評(píng)論0 收藏0
  • ECMASCript 2019可能會(huì)有哪些特性?

    摘要:可能不會(huì)包括所有的語(yǔ)法提案。事實(shí)上,有些提案已經(jīng)被擱置很多年了。因此,很可能也會(huì)在今年月份發(fā)布。 譯者按: 又過(guò)了1年... 原文:Whats New in JavaScript for 2019 譯者: Fundebug 為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。 最近這些年,ECMASCript標(biāo)準(zhǔn)發(fā)展節(jié)奏非常穩(wěn)定,每年都會(huì)發(fā)布新的特...

    tuantuan 評(píng)論0 收藏0
  • 精讀《Typescript 3.2 新特性》

    摘要:引言發(fā)布了幾個(gè)新特性,主要變化是類型檢查更嚴(yán)格,對(duì)一些時(shí)髦功能拓展了類型支持。精讀這次改動(dòng)意圖非常明顯,是為了跟上的新語(yǔ)法?;究梢运闶菍?duì)社區(qū)的回饋。討論地址是精讀新特性如果你想?yún)⑴c討論,請(qǐng)點(diǎn)擊這里,每周都有新的主題,周末或周一發(fā)布。 1 引言 Typescript 3.2 發(fā)布了幾個(gè)新特性,主要變化是類型檢查更嚴(yán)格,對(duì) ES6、ES7 一些時(shí)髦功能拓展了類型支持。 2 概要 下面挑一...

    cucumber 評(píng)論0 收藏0
  • FCC 成都社區(qū)·技術(shù)周刊 第 12 期

    摘要:詳情怎樣規(guī)避地獄作者先介紹什么是地獄,以及在開發(fā)過(guò)程中怎樣去規(guī)避地獄,一時(shí)爽性能問(wèn)題火葬場(chǎng)。詳情其他亮點(diǎn)匯總開發(fā)者大會(huì)已于北京時(shí)間月日凌晨在美國(guó)山景城正式啟幕。 【前端】 1. JavaScript 的新數(shù)據(jù)類型:BigInt BigInt?是 JavaScript 中的一個(gè)新的數(shù)字基本(primitive)類型,可以用任意精度表示整數(shù)。使用?BigInt?可以安全地存儲(chǔ)和操作大整數(shù),...

    fanux 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<