Статьи

ES6 в действии: новые числовые методы

В этой статье рассматриваются новые и улучшенные числовые методы в 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 .