diff options
author | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:42:52 -0500 |
---|---|---|
committer | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:42:52 -0500 |
commit | 074785cea106179cb3305637055ab0a009ca74f2 (patch) | |
tree | e6ae371cccd642aa2b67f39752a2cdf1fd4eb040 /files/ru/web/javascript/reference/global_objects/bigint | |
parent | da78a9e329e272dedb2400b79a3bdeebff387d47 (diff) | |
download | translated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.gz translated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.bz2 translated-content-074785cea106179cb3305637055ab0a009ca74f2.zip |
initial commit
Diffstat (limited to 'files/ru/web/javascript/reference/global_objects/bigint')
3 files changed, 445 insertions, 0 deletions
diff --git a/files/ru/web/javascript/reference/global_objects/bigint/asintn/index.html b/files/ru/web/javascript/reference/global_objects/bigint/asintn/index.html new file mode 100644 index 0000000000..67f371ecf6 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/bigint/asintn/index.html @@ -0,0 +1,79 @@ +--- +title: BigInt.asIntN() +slug: Web/JavaScript/Reference/Global_Objects/BigInt/asIntN +tags: + - BigInt + - JavaScript + - Method + - Reference + - asIntN +translation_of: Web/JavaScript/Reference/Global_Objects/BigInt/asIntN +--- +<div>{{JSRef}}</div> + +<p><strong><code>BigInt.asIntN</code></strong> — это статический метод, который позволяет перенести BigInt-значение в целое число со знаком между -2<sup>ширина-1</sup> and 2<sup>ширина-1</sup>-1.</p> + +<div>\{{EmbedInteractiveExample("pages/js/bigint-asintn.html")}}</div> + + + +<h2 id="Синтаксис">Синтаксис</h2> + +<pre class="syntaxbox">BigInt.asIntN(<var>width</var>, <var>bigint</var>);</pre> + +<h3 id="Аргументы">Аргументы</h3> + +<dl> + <dt><code>width</code></dt> + <dd>Количество битов, доступных для целочисленного размера.</dd> + <dt><code>bigint</code></dt> + <dd>Целое число для зажима, чтобы соответствовать поставляемым битам.</dd> +</dl> + +<h3 id="Возвращаемое_значение">Возвращаемое значение</h3> + +<p>Значение <code>bigint</code><span style="font-size: 13.3333px;"> </span>по модулю 2<code><sup>width</sup></code> как целое число со знаком.</p> + +<h2 id="Примеры">Примеры</h2> + +<h3 id="Пребывание_в_64-битных_диапазонах">Пребывание в 64-битных диапазонах</h3> + +<p>Метод <code>BigInt.asIntN()</code> может быть полезен, чтобы оставаться в диапазоне 64-битной арифметики.</p> + +<pre class="brush: js">const max = 2n ** (64n - 1n) - 1n; + +BigInt.asIntN(64, max); +// ↪ 9223372036854775807n + +BigInt.asIntN(64, max + 1n); +// ↪ -9223372036854775807n +// отрицательное число из-за переполнения +</pre> + +<h2 id="Спецификации">Спецификации</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Спецификации</th> + <th scope="col">Статус</th> + </tr> + <tr> + <td><a href="https://tc39.github.io/proposal-bigint/#sec-bigint.asintn">BigInt proposal</a></td> + <td>Stage 3</td> + </tr> + </tbody> +</table> + +<h2 id="Совместимость_браузеров">Совместимость браузеров</h2> + + + +<p>{{Compat("javascript.builtins.BigInt.asIntN")}}</p> + +<h2 id="Смотрите_также">Смотрите также</h2> + +<ul> + <li>{{JSxRef("BigInt")}}</li> + <li>{{JSxRef("BigInt.asUintN()")}}</li> +</ul> diff --git a/files/ru/web/javascript/reference/global_objects/bigint/asuintn/index.html b/files/ru/web/javascript/reference/global_objects/bigint/asuintn/index.html new file mode 100644 index 0000000000..6f3c09ba56 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/bigint/asuintn/index.html @@ -0,0 +1,72 @@ +--- +title: BigInt.asUintN() +slug: Web/JavaScript/Reference/Global_Objects/BigInt/asUintN +translation_of: Web/JavaScript/Reference/Global_Objects/BigInt/asUintN +--- +<div>{{JSRef}}</div> + +<p>The <strong><code>BigInt.asUintN</code></strong> static method is used to wrap a BigInt value to an unsigned integer between 0 and 2<sup>width</sup>-1.</p> + +<div>{{EmbedInteractiveExample("pages/js/bigint-asuintn.html", "taller")}}</div> + +<div class="hidden">The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> and send us a pull request.</div> + +<h2 id="Syntax">Syntax</h2> + +<pre class="syntaxbox notranslate">BigInt.asUintN(<var>width</var>, <var>bigint</var>);</pre> + +<h3 id="Parameters">Parameters</h3> + +<dl> + <dt><code><var>width</var></code></dt> + <dd>The amount of bits available for the integer size.</dd> + <dt><code><var>bigint</var></code></dt> + <dd>The integer to clamp to fit into the supplied bits.</dd> +</dl> + +<h3 id="Returns">Returns</h3> + +<p>The value of <code><var>bigint</var></code> modulo 2<sup><code><var>width</var></code></sup> as an unsigned integer.</p> + +<h2 id="Examples">Examples</h2> + +<h3 id="Staying_in_64-bit_ranges">Staying in 64-bit ranges</h3> + +<p>The <code>BigInt.asUintN()</code> method can be useful to stay in the range of 64-bit arithmetic.</p> + +<pre class="brush: js notranslate">const max = 2n ** 64n - 1n; + +BigInt.asUintN(64, max); +// ↪ 18446744073709551615n + +BigInt.asUintN(64, max + 1n); +// ↪ 0n +// zero because of overflow</pre> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{SpecName('ESDraft', '#sec-bigint.asuintn', 'BigInt.asUintN()')}}</td> + </tr> + </tbody> +</table> + +<h2 id="Browser_compatibility">Browser compatibility</h2> + + + +<p>{{Compat("javascript.builtins.BigInt.asUintN")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{JSxRef("BigInt")}}</li> + <li>{{JSxRef("BigInt.asIntN()")}}</li> +</ul> diff --git a/files/ru/web/javascript/reference/global_objects/bigint/index.html b/files/ru/web/javascript/reference/global_objects/bigint/index.html new file mode 100644 index 0000000000..9760700391 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/bigint/index.html @@ -0,0 +1,294 @@ +--- +title: BigInt +slug: Web/JavaScript/Reference/Global_Objects/BigInt +tags: + - BigInt + - JavaScript + - методы BigInt + - свойства BigInt +translation_of: Web/JavaScript/Reference/Global_Objects/BigInt +--- +<p>{{JSRef}}</p> + +<p><strong><code>BigInt</code></strong> это встроенный объект, который предоставляет способ представлять целые числа больше 2<sup>53</sup> - 1, наибольшего числа, которое JavaScript может надежно представить с {{JSxRef("Number")}} примитивом. Это максимальное значение можно получить, обратившись к {{JSxRef("Number.MAX_SAFE_INTEGER")}}.</p> + +<dl> +</dl> + +<h2 id="Описание">Описание</h2> + +<p><code>BigInt</code> создается путем добавления <code>n</code> в конец целочисленного литерала — <code>10n</code> — или вызовом функции <code>BigInt()</code>.</p> + +<pre class="brush: js">const theBiggestInt = 9007199254740991n; + +const alsoHuge = BigInt(9007199254740991); +// ↪ 9007199254740991n + +const hugeString = BigInt("9007199254740991"); +// ↪ 9007199254740991n + +const hugeHex = BigInt("0x1fffffffffffff"); +// ↪ 9007199254740991n + +const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111"); +// ↪ 9007199254740991n +</pre> + +<p>В некотором смысле он похож на {{JSxRef ("Number")}}, но отличается в некоторых ключевых моментах — его нельзя использовать с методами во встроенном объекте {{JSxRef ("Math")}} и нельзя смешивать в операциях с любыми экземплярами Number.</p> + +<div class="blockIndicator warning"> +<p>{{JSxRef("Number")}} и <code>BigInt</code> нельзя смешивать в операциях — они должны быть приведены к тому же типу.</p> + +<p>Будте осторожны приводя значения туда и обратно, так как точность BigInt может быть потеряна при приведении к числу (<code>Number)</code>.</p> +</div> + +<h3 id="Тип">Тип</h3> + +<p>При проверке с использованием оператора <code>typeof</code>, <code>BigInt</code> выдает тип <code>"bigint"</code>:</p> + +<pre class="brush: js">typeof 1n === 'bigint'; // true +typeof BigInt('1') === 'bigint'; // true +</pre> + +<p>При оборачивании в объект, BigInt будет представлен как обычный объект:</p> + +<pre class="brush: js">typeof Object(1n) === 'object'; // true +</pre> + +<h3 id="Операторы">Операторы</h3> + +<p>Следующие операторы могут использоваться с <code>BigInt</code> (или объектом-оберткой <code>BigInt</code>): <code>+</code>, <code>*</code>, <code>-</code>, <code>**</code>, <code>%</code>.</p> + +<p><a href="/ru/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators">Побитовые операции</a> также поддерживаются, кроме <code>>>></code> (сдвиг вправо с заполнением нулями).</p> + +<p>Не поддерживаемый унарный оператор (<code>+</code>) <a href="https://github.com/tc39/proposal-bigint/blob/master/ADVANCED.md#dont-break-asmjs">больше не ломает asm.js</a>.</p> + +<pre class="brush: js">const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER); +// ↪ 9007199254740991n + +const maxPlusOne = previousMaxSafe + 1n; +// ↪ 9007199254740992n + +const theFuture = previousMaxSafe + 2n; +// ↪ 9007199254740993n, это работает! + +const multi = previousMaxSafe * 2n; +// ↪ 18014398509481982n + +const subtr = multi – 10n; +// ↪ 18014398509481972n + +const mod = multi % 10n; +// ↪ 2n + +const bigN = 2n ** 54n; +// ↪ 18014398509481984n + +bigN * -1n +// ↪ –18014398509481984n +</pre> + +<p>Оператор <code>/</code> также работает, как и ожидалось, с целыми числами. Однако, поскольку это BigInt, эта операция будет округляться в меньшую сторону, то есть она не будет возвращать какие-либо дробные цифры.</p> + +<div class="blockIndicator warning"> +<p>Результат операции с дробным результатом будет округлен в <strong><u>меньшую</u></strong> сторону при использовании <code>BigInt</code>.</p> +</div> + +<pre class="brush: js">const expected = 4n / 2n; +// ↪ 2n + +const rounded = 5n / 2n; +// ↪ 2n, not 2.5n + +</pre> + +<h3 id="Сравнения">Сравнения</h3> + +<p><code>BigInt</code> равен {{JSxRef ("Number")}} только при нестрогом сравнении.</p> + +<pre class="brush: js">0n === 0 +// ↪ false + +0n == 0 +// ↪ true</pre> + +<p>{{JSxRef("Global_Objects/Number", "Обычные числа")}} и <code>BigInt</code> можно сравнивать как обычно.</p> + +<pre class="brush: js">1n < 2 +// ↪ true + +2n > 1 +// ↪ true + +2 > 2 +// ↪ false + +2n > 2 +// ↪ false + +2n >= 2 +// ↪ true</pre> + +<p>Они могут быть смешаны в массивах и отсортированы:</p> + +<pre class="brush: js">const mixed = [4n, 6, -12n, 10, 4, 0, 0n]; +// ↪ [4n, 6, -12n, 10, 4, 0, 0n] + +mixed.sort(); +// ↪ [-12n, 0, 0n, 10, 4n, 4, 6] +</pre> + +<p>Обратите внимание, что сравнения с <code>обьектом</code>-оберткой <code>BigInt</code> действуют как с другими объектами, указывая на равенство только когда сравинивается идентичный экземпляр объекта:</p> + +<pre class="brush: js">0n === Object(0n); // false +Object(0n) === Object(0n); // false + +const o = Object(0n); +o === o // true +</pre> + +<h3 id="Условные_выражения">Условные выражения</h3> + +<p><code>BigInt</code> ведёт себя как {{JSxRef("Global_Objects/Number", "обычное число")}} в следующих случаях:</p> + +<ul> + <li>Преобразуется в {{JSxRef("Global_Objects/Boolean", "Boolean")}} через функцию {{JSxRef("Global_Objects/Boolean", "Boolean")}}</li> + <li>Используется с логическими операторами {{JSxRef("Operators/Logical_Operators", "Logical Operators")}} <code>||</code>, <code>&&</code> и <code>!</code></li> + <li>В условном тесте, таком как {{JSxRef("Statements/if...else", "if statement")}}.</li> +</ul> + +<pre class="brush: js">if (0n) { + console.log('Привет из if!'); +} else { + console.log('Привет из else!'); +} + +// ↪ "Привет из else!" + +0n || 12n +// ↪ 12n + +0n && 12n +// ↪ 0n + +Boolean(0n) +// ↪ false + +Boolean(12n) +// ↪ true + +!12n +// ↪ false + +!0n +// ↪ true +</pre> + +<h2 id="Конструктор">Конструктор</h2> + +<dl> + <dt><code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/BigInt">BigInt()</a></code></dt> + <dd>Создаёт объект {{jsxref("BigInt")}}.</dd> +</dl> + +<h2 id="Статические_методы">Статические методы</h2> + +<dl> + <dt>{{JSxRef("BigInt.asIntN()")}}</dt> + <dd>Оборачивает BigInt в пределах от -2<sup>width-1</sup> до 2<sup>width-1</sup>-1</dd> + <dt>{{JSxRef("BigInt.asUintN()")}}</dt> + <dd>Оборачивает a BigInt в пределах от 0 до 2<sup>width</sup>-1</dd> +</dl> + +<h2 id="Методы_экземпляра">Методы экземпляра</h2> + +<dl> + <dt>{{JSxRef("BigInt.prototype.toLocaleString()")}}</dt> + <dd>Возвращает строку с языко-зависимым представлением числа. Переопредедяет метод {{JSxRef("Object.prototype.toLocaleString()")}}.</dd> + <dt>{{JSxRef("BigInt.prototype.toString()")}}</dt> + <dd>Возвращает строку, представляющую указанный объект по указанному основанию системы счисления. Переопределяет метод {{JSxRef("Object.prototype.toString()")}}.</dd> + <dt>{{JSxRef("BigInt.prototype.valueOf()")}}</dt> + <dd>Возвращает примитивное значение указанного объекта. Переопределяет метод {{JSxRef("Object.prototype.valueOf()")}}.</dd> +</dl> + +<h2 id="Рекомендации_по_использованию">Рекомендации по использованию</h2> + +<h3 id="Приведение">Приведение</h3> + +<p>Поскольку приведение между {{JSxRef("Number")}} и <code>BigInt</code> может привести к потере точности, рекомендуется использовать<code> BigInt</code> только тогда, когда разумно ожидаются значения, превышающие 2<sup>53</sup> и не приводить между двумя типами.</p> + +<h3 id="Криптография">Криптография</h3> + +<p>Операции поддерживаемые <code>BigInt</code> не постоянны во времени. <code>BigInt</code> следовательно <a href="https://www.chosenplaintext.ca/articles/beginners-guide-constant-time-cryptography.html">не пригоден для использования в криптографии</a>.</p> + +<h3 id="Использование_вместе_с_JSON">Использование вместе с JSON</h3> + +<p>Использование {{jsxref("JSON.stringify()")}} с любым значением типа <code>BigInt</code> приведёт к <code>TypeError</code>, поскольку значения <code>BigInt</code> не преобразуется в JSON по умолчанию, однако вы можете реализовать свой собственный метод <code>toJSON</code>, если вам необходимо:</p> + +<pre class="brush: js">BigInt.prototype.toJSON = function() { return this.toString() } +</pre> + +<p>Теперь вместо ошибки, <code>JSON.stringify</code> будет создавать строку:</p> + +<pre class="brush: js">JSON.stringify(BigInt(1)) +// '"1"' +</pre> + +<h2 id="Примеры">Примеры</h2> + +<h3 id="Расчет_простых_чисел">Расчет простых чисел</h3> + +<pre class="brush: js">// Возвращает true, если BigInt — простое число +function isPrime(p) { + for (let i = 2n; i * i <= p; i++) { + if (p % i === 0n) return false; + } + return true; +} + +// Берет BigInt в качестве аргумента и возвращает BigInt +function nthPrime(nth) { + let maybePrime = 2n; + let prime = 0n; + + while (nth >= 0n) { + if (isPrime(maybePrime)) { + nth--; + prime = maybePrime; + } + maybePrime++; + } + + return prime; +} + +nthPrime(20n) +// ↪ 73n</pre> + +<h2 id="Спецификации">Спецификации</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Спецификация</th> + </tr> + <tr> + <td>{{SpecName("ESDraft", "#sec-bigint-objects", "<code>BigInt</code> objects")}}</td> + </tr> + </tbody> +</table> + +<h2 id="Совместимость_браузера">Совместимость браузера</h2> + +<div> + + +<p>{{Compat("javascript.builtins.BigInt")}}</p> +</div> + +<h2 id="Смотрите_также">Смотрите также</h2> + +<ul> + <li>{{JSxRef("Number")}}</li> + <li>{{JSxRef("Number.MAX_SAFE_INTEGER")}}</li> +</ul> |