Классификация типов данных в JavaScript 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Классификация типов данных в JavaScript



Null- чего-то не существует

Undefined – что-то существуюет, но нет значения

Объект – коллекция данных(комплексный тип данных). Структура используется для хранения данных любых типов

Данные в объекте – свойства, действия в объекте – методы

Ключ – свойство объекта (name), значение – ‘John’

Массив – частный случай объекта

Классический массив

, элементы лежат строго по поряду и можно поместить любой тип данных

Можно вызвать элемент  как результат . Нумерация с 0

Проблема Number и зачем нужен BigInt

До текущего момента, все числа, и целые и дробные были представлены одним типом Number, так же имеющим название “double-precision floats”. Если не вникать в подробности, то это означает, что этот тип имеет ограниченную точность. Константа Number.MAX_SAFE_INTEGER хранит максимально возможное целое число, которое можно безопасно увеличивать. Его значение равно двум в пятдесят третьей степени, минус один (2**53–1).

 

https://gist.github.com/Hydrock/7a242724118b8d02be61ced6beb5525b

Попробуем сложить максимальное число и единицу. Результат верный — число больше на единицу.

 

https://gist.github.com/Hydrock/ffa382914be49fcf7947c6375c4c518c

Но при сложении с двойкой, JS выдает ошибочный результат, в нашем случае такой же как и предыдущий.

 

https://gist.github.com/Hydrock/3334e15e657fd3c1ee4c35aa2be245c8

Проблема, думаю, видна. Все расчеты, вне диапазона от Number.MIN_SAFE_INTEGER до Number.MAX_SAFE_INTEGER, могут быть неточными.

BigInt

BigInt — новый числовой примитив, который позволяет использовать большие числа с высокой точностью.

Чтобы создать BigInt, добавьте суффикс n в любой целочисленный литерал. Например, 123 становится 123n. Глобальную функцию BigInt можно использовать для преобразования обычного числа в BigInt. Другими словами, BigInt (123) === 123n. Теперь решим нашу проблему используя BigInt.

 

https://gist.github.com/Hydrock/8673fdb014587fef724f7235c3c096f0

Результат верный!

Вот еще один пример, где мы умножаем два числа с типом Number:

 

https://gist.github.com/Hydrock/31925f7e931cd00b06850b397013d565

Мы знаем, что результат умножения должен заканчиваться на 7 (так как последние цыфры в числах 9 и 3, 9 * 3 === 27). Однако результат заканчивается набором нулей. Повторим то жесамое с BigInts:

 

https://gist.github.com/Hydrock/26980a29256b6783144c9dce4c5939a3

И снова, с BigInt, ответ верный.

Безопасные пределы (Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER) не применяются к BigInts. Мы можем спокойно выполнять целочисленную арифметику, не беспокоясь о потере точности.

Новый примитив

BigInt — новый примитив в языке JavaScript. Тип BigInt может быть определен с помощью оператора typeof:

 

https://gist.github.com/Hydrock/e22de4b8f514a9e6eff771c365ed91fa

BigInt — это отдельный тип, и по этому при строгом сравнении (===) с Number мы увидим false. Прежде чем выполнять строгое сравнение (без приведения типов) BigInt с Number, нужно преобразовать один из них в тип другого.

 

https://gist.github.com/Hydrock/516ef4af9fa927cd0baa79b8a11e5d8e

При принуждении к логическому (что происходит при использовании if, &&, || или Boolean (int), например), BigInts следуют той же логике, что и Numbers.

Если необходимо привести BigInt к логическому типу (что происходит при использовании if, &&, ||, Boolean(int)), то новый тип ведет себя подобно типу Number:

 

https://gist.github.com/Hydrock/eed8e6adc0c15f488258b9eb07a05d37

asm.js

Прежде чем мы пойдем дальше нужно немного затронуть asm.js (хоть и сам столкнулся впервые), ведь новый тип чисел тесно связан с этой реализацией языка.

asm.js это оптимизированное низкоуровневое подмножество JavaScript. И если попытаться еще проще — это некий низкоуровневый синтаксис, с доступом к памяти, подобный c или c++, в основном предназначенный для работы с арифметикой. После компиляции мы получаем очень оптимизированный js код.

Разработчики новых реализаций JS заимствуют решения из asm.js и пытаются поддерживать совместимость. Asm.js это огромная тема и довольно сложная, но может когда то и осилю и ее.

Операторы

BigInt поддерживает наиболее распространенные операторы. Двоичные +, -, * и ** работают как и ожидается. / и % работают и округляют до нуля по мере необходимости. Побитовые операции |, &, <<, >> и ^ выполняют поразрядную арифметику, при условии представления two’s complement representation для отрицательных значений, как и для Number.

 

https://gist.github.com/Hydrock/f0a303c5214c6359dfe99ca2af93a407

Унарный минус (-) может использоваться для обозначения отрицательного значения BigInt, например -42n. Унарный плюс (+)не поддерживается, потому что он нарушит код asm.js, который ожидает, что конструкция вида +x всегда будет возвращать либо Number, либо выбрасывать исключение.

Так же, нельзя смешивать операции между BigInts и Numbers. Это хорошо, потому что любое неявное преобразование может потерять часть информации. Рассмотрим пример:

 

https://gist.github.com/Hydrock/3c9191d12cb2eb87a22c7b1919a378ee

Что увидим в результате? Здесь нет и не может быть правильного ответа. Если предположить, что движок попытается привести типы, то все равно, BigInt не может содержать дробные числа, а Number не может отобразить точное число выше безопасного. Поэтому такие операции приведут к выбросу исключения TypeError.

Есть только одно исключение — это операторы сравнения, такие как ===, < и >=, так как они возвращают одно из двух логических значений, и не рискуют точностью.

 

https://gist.github.com/Hydrock/60c2297cb26454e3e1b2a2601bd96216

API

Доступно несколько новых API методов BigInt.

Конструктор BigInt похож на конструктор Number: он преобразует свой аргумент в тип BigInt. Если преобразование невозможно, будет выброшено исключение SyntaxError или RangeError.

 

https://gist.github.com/Hydrock/3322e615078d3d27880b8f4fd41392cd

Функции утилиты

BigInt.parseInt(string, radix?) — Работает аналогично Number.parseInt (), но выдает SyntaxError вместо возврата NaN в случае невозможности вычислить значение.

Так же есть возможность ограничивать число по битам, BigInt.asUint и NBigInt.asInt. Их я описывать не буду, это связано с побитовыми операциями. Если интересно — вот спека.

Отзывы

Уже есть замечания по производительности. В любом случае — BigInt еще черновик.

 

 


 



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 111; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.173.227 (0.008 с.)