- Notifications
You must be signed in to change notification settings - Fork111
BigInt#430
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Merged
nazarepiedady merged 3 commits intojavascript-tutorial:masterfromdanilolmc:update-bigintFeb 11, 2024
Uh oh!
There was an error while loading.Please reload this page.
Merged
BigInt#430
Changes fromall commits
Commits
Show all changes
3 commits Select commitHold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
89 changes: 44 additions & 45 deletions1-js/99-js-misc/05-bigint/article.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,130 +1,129 @@ | ||
# BigInt | ||
[BigInt recentemente adicionado ao caniuse="bigint"] | ||
BigInt é um tipo numérico especial que oferece suporte para inteiros de tamanho arbitrário. | ||
Um biginté criado anexando`n`ao final de umliteralinteiro ou chamando a função `BigInt`que cria BigInts a partir destrings,números, etc. | ||
```js | ||
const bigint = 1234567890123456789012345678901234567890n; | ||
const sameBigint = BigInt("1234567890123456789012345678901234567890"); | ||
const bigintFromNumber = BigInt(10); //o mesmo que 10n | ||
``` | ||
##Operadores matemáticos | ||
`BigInt`pode ser usado principalmente como um número comum, por exemplo: | ||
```js run | ||
alert(1n + 2n); // 3 | ||
alert(5n / 2n); // 2 | ||
``` | ||
Perceba: a divisão `5/2`retorna o resultado arredondado para zero,sem a parte decimal. Todas as operações com BigInts retornam BigInts. | ||
Não podemos misturar BigInts e números comuns: | ||
danilolmc marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
```js run | ||
alert(1n + 2); //Erro: Não é possível misturarBigInte outros tipos | ||
``` | ||
Devemos convertê-los explicitamente, se necessário, usando`BigInt()`ou `Number()`,assim: | ||
```js run | ||
let bigint = 1n; | ||
let number = 2; | ||
// numberpara bigint | ||
alert(bigint + BigInt(number)); // 3 | ||
// bigintpara number | ||
alert(Number(bigint) + number); // 3 | ||
``` | ||
As operações de conversão são sempre silenciosas, nunca dão erros, mas se o bigintfor muito grande e não couber no tipo número, entãobitsextras serão cortados, então devemos ter cuidado ao fazer a conversão. | ||
````smart header="O operador mais unário não é suportado em BigInts" | ||
O operador mais unário `+valor` é uma maneira bem conhecida de converter `valor` para um número. | ||
Para evitar confusão, não é suportado em BigInts: | ||
```js run | ||
let bigint = 1n; | ||
alert( +bigint ); //erro | ||
``` | ||
Então, devemos usar`Number()`para converter um BigInt em um número. | ||
```` | ||
##Comparações | ||
Comparações, como`<`, `>`funcionam bem com BigInts e números: | ||
```js run | ||
alert( 2n > 1n ); // true | ||
alert( 2n > 1 ); // true | ||
``` | ||
Note que, como números e BigInts pertencem a tipos diferentes, eles podem ser iguais `==`,mas não estritamente iguais `===`: | ||
```js run | ||
alert( 1 == 1n ); // true | ||
alert( 1 === 1n ); // false | ||
``` | ||
##Operações booleanas | ||
Quando dentro de`if`ou outras operações booleanas, BigInts se comportam como números. | ||
Por exemplo, em `if`,obigint `0n`é falso, outros valores são verdadeiros: | ||
```js run | ||
if (0n) { | ||
//nunca executa | ||
} | ||
``` | ||
Operadores booleanos, como `||`, `&&` e outros também funcionam com BigInts semelhante aos números: | ||
```js run | ||
alert( 1n || 2 ); // 1 (1né considerado verdadeiro) | ||
alert( 0n || 2 ); // 2 (0né considerado falso) | ||
``` | ||
## Polyfills | ||
Fazer um polyfill para BigInts é complicado. A razão é que muitos operadores JavaScript, como`+`, `-`e assim por diante se comportam de maneira diferente com BigInts em comparação com números regulares. | ||
Por exemplo, a divisão de BigInts sempre retorna umbigint (arredondado se necessário). | ||
Para emular tal comportamento, um polyfillprecisaria analisar o código e substituir todos esses operadores com suas funções. Mas fazer isso é trabalhoso e custaria muito em termos de desempenho. | ||
Então, não há umpolyfill bem conhecido e bom. | ||
Apesar disso, o caminho inverso é proposto pelos desenvolvedores da biblioteca[JSBI](https://github.com/GoogleChromeLabs/jsbi). | ||
Esta biblioteca implementa números grandes usando seus próprios métodos. Podemos usá-los em vez de BigInts nativos: | ||
|Operação | `BigInt` nativo | JSBI | | ||
|-----------|-----------------|------| | ||
|Criação a partir de Number | `a = BigInt(789)` | `a = JSBI.BigInt(789)` | | ||
|Adição | `c = a + b` | `c = JSBI.add(a, b)` | | ||
|Subtração| `c = a - b` | `c = JSBI.subtract(a, b)` | | ||
| ... | ... | ... | | ||
...E então useo polyfill (plugin do Babel) para converter chamadasJSBIpara BigInts nativos para aqueles navegadores que os suportam. | ||
Em outras palavras, essa abordagem sugere que escrevamos código emJSBIem vez de BigInts nativos. Mas oJSBItrabalha com números como se fossem BigInts internamente, emula-os de perto seguindo a especificação, então o código será "pronto parabigint". | ||
Podemos usar esse código JSBI"como está" para motores que não suportam BigInts e para aqueles que suportam - o polyfillconverterá as chamadas para BigInts nativos. | ||
##Referências | ||
- [Documentação da MDN sobreBigInt](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/BigInt). | ||
- [Especificação](https://tc39.es/ecma262/#sec-bigint-objects). |
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.