Comments 30
О каком непочиненном костыле речь?
Наверно речь о том что в JS не хватает целых чисел ((u)int32
, u(int64)
), и использовать вместо них float
это костыль, в тех случаях когда предметная область предполагает целые числа.
Теперь же, вместо того чтобы добавить целые числа определённого размера, добавили BigNumber
— что намного менее производительно и во многих случаях могло бы быть заменено на int64
или int128
.
Вы n
пропустили в записи числа.
А так хорошее нововведение, вот как раз недавно страдал, что в 2^53 идентификаторы не влезают (а в 2^64 влезли бы).
Унарный — можно использовать для обозначения отрицательного значения BigInt, например, -42n. Унарный + не поддерживается, потому что он нарушит код asm.js, который ожидает, что +x всегда будет возвращать либо Number, либо исключение.
Ну вот, добавили полезную фичу, чтоб пофиксить костыль, но и она вышла с костылем.
А что насчёт передачи bigint в json?
Как нужно будет парсить строку и понимать, что там находится?
Ведь нельзя складывать(умножать, ..) bigint с обычными числами
JSON.stringify({a:123n})
VM97:1 Uncaught TypeError: Do not know how to serialize a BigInt
at JSON.stringify (<anonymous>)
Почему только BigInt? Почему бы заодно не сделать BigFloat или BigNumber?
математические операции над большими числами обычно используются в финансовых технологиях
Чтобы подсчитать, сколько нашли денег у главы питерского ростехнадзора. )
Простите, не удержался.
Лично я уже пробовал использовать в качестве ключей для Map.
Для пространства 2D плоскость 32bitx32bit = 64bit ключ для Map, что бы не ремапить проекцию. (Вечно перепиливаемая заново браузерная игрушка-платформер с "бесконечным" миром)
Сейчас для ключа с быстрыми побитовыми операциями (работа с тайлами), безопасно использовать только по 16bit (x + y<<16, с number побитовая арифметика корректна только в приделах 32бит ключ), т.е. 64536 x ..., а с bigint 32bit x ...
Там годятся только элементарные типы — числа или строки, но не объекты.
Точнее, чисто технически объекты использовать тоже можно, но смысла в этом нет, потому что для равенства ключей не годится объект-копия с аналогичными значениями полей, нужен только строго именно тот же самый объект.
Теперь браузер можно повесить еще проще...
1n << 10000000n
P.S. chrome unstable — 68.0.3418.2 (Official Build) dev (64-bit)
./node
> 123n*1
TypeError: Cannot mix BigInt and other types, use explicit conversions
так и задумывалось?
Доступна ли операция деления с остатком за одно действие (DivRem) у BigInt
— это быстрее, чем использовать последовательное / и %? Во многих языках программирования такая есть.
BigInt — длинная арифметика в JavaScript