Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Классификация типов данных в 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; просмотров: 132; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.223.205.73 (0.01 с.) |