В этой статье рассматриваются новые и улучшенные числовые методы в ES6 (ECMAScript 6).
Это часть серии о новых возможностях ES6, в которой мы также обсудили новые методы, доступные для типов данных String и Array , а также новые типы данных, такие как Map и WeakMap .
Я познакомлю вас с новыми методами и константами, добавленными к типу данных Number
. Как мы увидим, некоторые из числовых методов совсем не новы, но они были улучшены и / или перемещены под нужный объект (например, isNaN()
). Как всегда, мы также приведем новые знания в действие на нескольких примерах. Итак, без лишних слов, давайте начнем.
Number.isInteger ()
Первый метод, который я хочу охватить, это Number.isInteger()
. Это новое дополнение к JavaScript, и это то, что вы, возможно, определили и использовали сами в прошлом. Он определяет, является ли значение, переданное функции, целым числом или нет. Этот метод возвращает true
если переданное значение является целым числом, и false
противном случае. Реализация этого метода была довольно простой, но все же хорошо иметь ее изначально. Одним из возможных решений для воссоздания этой функции является:
Number.isInteger = Number.isInteger || function (number) { return typeof number === 'number' && number % 1 === 0; };
Ради интереса я попытался воссоздать эту функцию, и в итоге я использовал другой подход:
Number.isInteger = Number.isInteger || function (number) { return typeof number === 'number' && Math.floor(number) === number; };
Обе эти функции хороши и полезны, но они не соответствуют спецификациям ECMAScript 6. Итак, если вы хотите заполнить этот метод, вам понадобится что-то более сложное, как мы увидим ниже. На данный момент давайте начнем с обнаружения синтаксиса Number.isInteger()
:
Number.isInteger(number)
number
аргумент представляет значение, которое вы хотите проверить.
Некоторые примеры использования этого метода приведены ниже:
// prints 'true' console.log(Number.isInteger(19)); // prints 'false' console.log(Number.isInteger(3.5)); // prints 'false' console.log(Number.isInteger([1, 2, 3]));
Демонстрационная версия предыдущего кода показана ниже и также доступна на JSBin .
Метод поддерживается в Node и во всех современных браузерах, за исключением Internet Explorer. Если вам требуется поддержка старых браузеров, вы можете использовать полифилл, такой как тот, который доступен в Mozilla Developer Network на странице методов . Это также воспроизведено ниже для вашего удобства:
if (!Number.isInteger) { Number.isInteger = function isInteger (nVal) { return typeof nVal === 'number' && isFinite(nVal) && nVal > -9007199254740992 && nVal < 9007199254740992 && Math.floor(nVal) === nVal; }; }
Number.isNaN ()
Если вы писали какой-либо код JavaScript в прошлом, этот метод не должен быть для вас новым. Некоторое время isNaN()
JavaScript был метод isNaN()
который isNaN()
через объект window
. Этот метод проверяет, равно ли значение NaN
, и в этом случае он возвращает true
или иначе false
. Проблема с window.isNaN()
состоит в том, что у него есть проблема в том, что он также возвращает true
для значений, которые преобразованы в число, будет NaN
. Чтобы дать вам конкретное представление об этой проблеме, все следующие утверждения возвращают true
:
// prints 'true' console.log(window.isNaN(0/0)); // prints 'true' console.log(window.isNaN('test')); // prints 'true' console.log(window.isNaN(undefined)); // prints 'true' console.log(window.isNaN({prop: 'value'}));
Вам может понадобиться метод, который возвращает true
только если передано значение NaN
. Вот почему ECMAScript 6 представил метод Number.isNaN()
. Его синтаксис очень похож на тот, который вы ожидаете:
Number.isNaN(value)
Здесь value
— это значение, которое вы хотите проверить. Некоторые примеры использования этого метода показаны ниже:
// prints 'true' console.log(Number.isNaN(0/0)); // prints 'true' console.log(Number.isNaN(NaN)); // prints 'false' console.log(Number.isNaN(undefined)); // prints 'false' console.log(Number.isNaN({prop: 'value'}));
Как видите, тестируя одни и те же значения, мы получаем разные результаты.
Демонстрационная версия предыдущего фрагмента приведена ниже и также доступна на сайте JSBin .
Метод поддерживается в Node и во всех современных браузерах, за исключением Internet Explorer. Если вы хотите поддерживать другие браузеры, очень простой полифилл для этого метода выглядит следующим образом:
Number.isNaN = Number.isNaN || function (value) { return value !== value; };
Это работает потому, что NaN
— единственное нерефлексивное значение в JavaScript, что означает, что это единственное значение, которое не равно самому себе.
Number.isFinite ()
Этот метод имеет ту же историю, что и предыдущий. В JavaScript есть метод window.isFinite()
который проверяет, является ли переданное значение конечным числом или нет. К сожалению, он также возвращает true
для значений, которые будут преобразованы в число с конечным числом. Примеры этой проблемы показаны ниже:
// prints 'true' console.log(window.isFinite(10)); // prints 'true' console.log(window.isFinite(Number.MAX_VALUE)); // prints 'true' console.log(window.isFinite(null)); // prints 'true' console.log(window.isFinite([]));
По этой причине в ECMAScript 6 есть метод isFinite()
который принадлежит Number
. Его синтаксис следующий:
Number.isFinite(value)
Здесь value
— это значение, которое вы хотите проверить. Если вы протестируете те же значения из предыдущего фрагмента, вы увидите, что результаты отличаются:
// prints 'true' console.log(Number.isFinite(10)); // prints 'true' console.log(Number.isFinite(Number.MAX_VALUE)); // prints 'false' console.log(Number.isFinite(null)); // prints 'false' console.log(Number.isFinite([]));
Демонстрационная версия предыдущего фрагмента приведена ниже и также доступна на сайте JSBin .
Метод поддерживается в Node и во всех современных браузерах, за исключением Internet Explorer. Вы можете найти его для заполнения на странице метода в MDN .
Number.isSafeInteger ()
Метод Number.isSafeInteger()
является совершенно новым дополнением к ES6. Он проверяет, является ли переданное значение безопасным целым числом, и в этом случае возвращает значение true
. Безопасное целое число определяется как целое число, которое удовлетворяет обоим следующим двум условиям:
- число может быть точно представлено как число двойной точности IEEE-754
- представление числа IEEE-754 не может быть результатом округления любого другого целого числа, чтобы соответствовать представлению IEEE-754.
Исходя из этого определения, безопасными целыми являются все целые числа от — (2 53 — 1) включительно до 2 53 — 1 включительно. Эти значения важны, и мы обсудим их немного больше в конце этого раздела.
Синтаксис этого метода:
Number.isSafeInteger(value)
Здесь value
— это значение, которое вы хотите проверить. Несколько примеров использования этого метода показаны ниже:
// prints 'true' console.log(Number.isSafeInteger(5)); // prints 'false' console.log(Number.isSafeInteger('19')); // prints 'false' console.log(Number.isSafeInteger(Math.pow(2, 53))); // prints 'true' console.log(Number.isSafeInteger(Math.pow(2, 53) - 1));
Демонстрационная версия этого кода показана ниже и также доступна на JSBin .
Number.isSafeInteger()
поддерживается в Node и во всех современных браузерах, за исключением Internet Explorer. Полифилл для этого метода, извлеченный из es6-shim Полом Миллером :
Number.isSafeInteger = Number.isSafeInteger || function (value) { return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER; };
Обратите внимание, что этот polyfill основан на Number.isInteger()
который обсуждался ранее, поэтому вам нужно также заполнить последний метод, чтобы использовать этот.
ECMAScript 6 также ввел два связанных постоянных значения: Number.MAX_SAFE_INTEGER
и Number.MIN_SAFE_INTEGER
. Первый представляет максимальное безопасное целое число в JavaScript — то есть 2 53 — 1, а второй — минимальное безопасное целое число, которое — — (2 53 — 1). Как вы могли заметить, это те же значения, которые я цитировал ранее.
Number.parseInt () и Number.parseFloat ()
Number.parseInt()
и Number.parseFloat()
рассматриваются в том же разделе, поскольку, в отличие от других аналогичных методов, упомянутых в этой статье, они уже существовали в предыдущей версии ECMAScript, но не отличаются от своей старой глобальной версии. , Таким образом, вы можете использовать их так же, как вы делали до сих пор, и вы можете ожидать те же результаты. Целью добавления этих методов в Number
является модульность глобалов.
Ради полноты я сообщаю об их синтаксисе:
// Signature of Number.parseInt Number.parseInt(string, radix) // Signature of Number.parseFloat Number.parseFloat(string)
Здесь string
представляет значение, которое вы хотите проанализировать, а radix
— это основание, которое вы хотите использовать для преобразования string
.
Следующий фрагмент показывает несколько примеров использования:
// Prints '-3' console.log(Number.parseInt('-3')); // Prints '4' console.log(Number.parseInt('100', 2)); // Prints 'NaN' console.log(Number.parseInt('test')); // Prints 'NaN' console.log(Number.parseInt({})); // Prints '42.1' console.log(Number.parseFloat('42.1')); // Prints 'NaN' console.log(Number.parseFloat('test')); // Prints 'NaN' console.log(Number.parseFloat({}));
Демонстрационная версия этого кода показана ниже и также доступна на JSBin .
Эти методы поддерживаются в Node и во всех современных браузерах, за исключением Internet Explorer. Если вы хотите их заполнить, вы можете просто вызвать их связанный глобальный метод, как указано ниже:
// Polyfill Number.parseInt Number.parseInt = Number.parseInt || function () { return window.parseInt.apply(window, arguments); }; // Polyfill Number.parseFloat Number.parseFloat = Number.parseFloat || function () { return window.parseFloat.apply(window, arguments); };
Поддержка браузера
На следующем рисунке показана поддержка браузером расширений встроенного объекта Number
в ES6. Наведите курсор мыши на поля, чтобы увидеть процент использования соответствующих версий браузера.
Числовые методы ES6: завершение
В этом уроке мы рассмотрели новые методы и константы, добавленные в ECMAScript 6, которые работают с типом данных Number
. Стоит отметить, что ES6 также добавил еще одну константу, о которой я до сих пор не упомянул. Это Number.EPSILON
и представляет собой разницу между одним и наименьшим значением, превышающим единицу, которое может быть представлено как
С этой последней запиской мы завершили наше путешествие для типа данных Number
.Number
.