Javascript приведение к целому. Преобразование типов данных в JavaScript. Преобразования типов данных


В JavaScript существуют 2 встроенные функции для преобразования строк в числа: parseFloat() и parseInt() .

parseFloat() принимает аргументом строку, которую необходимо привести к численному типу, и возвращает число типа float. Число должно содержаться в начале строки. Если после числа в строке идут ещё какие-то символы, то они отсекаются. Дробная часть числа должна быть записана через точку (запятая не воспринимается как разделитель). В случае, если parseFloat() не может преобразовать строку, то она возвращает NaN.

Также функция может обработать «число n, умноженное на 10 в степени x», которое в программировании принято записывать через букву E, например: 0.5E6 или 0.5E+6. Степень может быть также отрицательная: 0.5E-6, что равно 0.5*10^-6 или 0.5/1000000.

ParseFloat(""3.78kg"") // 3.78 parseFloat(""kg33"") // NaN parseFloat(""0004.111"") // 4.111 parseFloat(""0x66"") // 0 parseFloat("".5"") // 0.5 parseFloat(""-.5"") // -0.5 parseFloat(""0.5e6"") // 500000 parseFloat(""0.03E+2"") // 3 parseFloat(""3E-4"") // 0.0003 parseFloat(""-3E-4"") // -0.0003

Функция parseInt(string[, radix]) принимает в качестве первого аргумента строку, анализирует её и возвращает целое число (тип integer). Функция пытается анализировать систему счисления, в которой записано число в исходной строке (например, десятичная, восьмеричная или шестнадцатеричная — но не только эти). Также систему счисления можно указать явно, передав её вторым параметром radix. Параметр radix может принимать любое число от 2 до 36 (в системах выше 10-й используются буквы английского алфавита, от A до Z).

Числа типа 1.5e6 функция не обрабатывает так, как parseFloat() .

Ознакомьтесь, пожалуйста, с примерами ниже, чтобы не наколоться на подводные камни, запрятаны в работе функции parseInt() .

ParseInt(""25"") // 25 parseInt(""-25"") // -25 parseInt(""45.12"") // 45 parseInt(""045"",10) // 45 parseInt(""70"",8) // 56 (70 в восьмеричной системе это 56 в десятичной) parseInt(""070"") // 56 (ВАЖНО!!! нуль вначале заставит функцию проанализировать строку как восьмеричное число) parseInt(""88"",8) // NaN (в восьмеричной системе нет цифры 8) parseInt(""a1"") // NaN (ВАЖНО!!! Функция по умолчанию не воспринимает число как 16-ричное, если не дописать в начале строки 0x) parseInt(""a1"",16) // 161 (здесь явно указана система счисления) parseInt(""0xa1"") // 161 (правильный формат 16-ричного числа, можно не указывать второй параметр) parseInt(""099"") // 0 (ВАЖНО!!! Число воспринимается как восьмеричное, но содержащее недопустимые символы) parseInt(""0.5e6"") // 0 (ВАЖНО!!! не работает как parseFloat) parseInt(""ZZ"",36) // 1295 parseInt(""-FF"") // NaN parseInt(""-FF"",16) // -255

Если Вы обрабатываете данные из текстового поля, которые вводит пользователь, всегда используйте parseInt() вместе со вторым параметром radix, это обезопасит Ваш код от неожиданных результатов.

JavaScript – нетипизированный язык (точнее, слабо типизированный или динамически типизированный). Это значит, что мы не должны задавать тип переменной при ее объявлении. Нетипизированность придает JavaScript гибкость и простоту, предпочтительную для языка сценариев (хотя эти особенности достаются ценой отсутствия строгости, важной для длинных и более сложных программ, которые часто пишутся на более строгих языках, таких как C или Java). Важной чертой гибкой работы с типами данных в JavaScript являются выполняемые интерпретатором автоматические преобразования данных. Например, если методу document.write() передается число, JavaScript автоматически преобразует его в эквивалентное строковое представление. Аналогично, проверяя строковое значение в условии инструкции if, JavaScript автоматически преобразует эту строку в логическое значение – в false, если строка пуста, и в true в противном случае.

Основное правило состоит в том, что когда значение одного тип встречается в контексте, где требуется значение какого-то другого типа, JavaScript автоматически пытается преобразовать значение требуемым образом. Поэтому, например, в контексте, предполагающем логическую переменную, число преобразуется в логическое значение.

Объект в строковом контексте преобразуется в строку. Cтроку в числовом контексте JavaScript пытается преобразовать в число.

Преобразования «объект-элементарный тип»
Например, в логическом контексте все приведенные ниже объекты преобразуются в true:

New Boolean(false) // Внутреннее значение равно false, но объект
// преобразуется в true
new Number(0)
new String("")
new Array()

Преобразование объектов в числа начинается с вызова метода valueOf() этого объекта. Большинство объектов наследуют стандартный метод valueOf() класса Object, который просто возвращает сам объект. Так как стандартный метод valueOf() не возвращает элементарного значения, JavaScript затем пытается преобразовать объект в число путем вызова его метода toString() и преобразования полученной строки в число. Для массивов это приводит к интересным результатам. Вспомните, что метод toString()преобразует элементы массива в строки, а затем возвращает результат конкатенации этих строк с запятыми между ними. Следовательно, массив без элементов преобразуется в пустую строку, которая преобразуется в 0! Кроме того, если массив состоит из одного элемента, числа n, то массив преобразуется в строковое представление этого числа, которое затем преобразуется обратно в само число n.

Если массив содержит более одного элемента, или если его единственный элемент не является числом, массив преобразуется в NaN. В JavaScript контекст не всегда определяется однозначно! Оператор + и операторы сравнения (и >=) работают как с числами, так и со строками, поэтому когда объект используется с одним из этих операторов, неясно, во что он должен преобразовываться – в число или в строку. В большинстве случаев JavaScript сначала пытается преобразовать объект путем вызова метода valueOf(). Если этот метод возвращает элементарное значение (обычно число), используется это значение. Однако часто valueOf() просто возвращает объект без преобразования; в этом случае JavaScript затем пытается преобразовать объект в строку с помощью вызова метода toString(). Имеется только одно исключение из этого правила преобразования: когда объект Date используется с оператором +, преобразование выполняется с помощью метода toString(). Существование этого исключения обусловлено тем, что Date имеет как метод toString(), так и метод valueOf(). При использовании Date с оператором + почти всегда требуется выполнить строковую конкатенацию. Но когда Date участвует в операциях сравнения, почти всегда требуется выполнить числовое сравнение, для того чтобы определить, какой из двух моментов времени предшествовал другому.

Большинство объектов либо не имеют метода valueOf(), либо этот метод не возвращает полезных результатов.

Когда к объекту применяется оператор +, обычно имеет место строковая конкатенация, а не сложение. Когда к объекту применяется оператор сравнения, обычно выполняется строковое сравнение, а не числовое.

Объект, определяющий специальный метод valueOf(), может вести себя по-другому. Определив метод valueOf(), возвращающий число, можно применять к своему объекту арифметические и другие операторы, но добавление своего объекта к строке будет выполняться не так, как ожидается: метод toString() больше не вызывается и в конкатенации участвует строковое представление числа, возвращаемого методом valueOf().

И наконец, помните, что метод valueOf() не называется toNumber(), строго говоря, его задача состоит в преобразовании объекта в осмысленное элементарное значение, поэтому некоторые объекты могут иметь методы valueOf(), возвращающие строки.

Явные преобразования типов
Java-Script не определяет оператор преобразования, как в языках C, C++ и Java, но предоставляет сходные средства. В JavaScript 1.1 (и в стандарте ECMA-262) Number(), Boolean(), String() и Object() могут вызываться не только как конструкторы, но и как функции. Будучи вызваны таким образом, эти функции пытаются преобразовать свои
аргументы в соответствующий тип. Например, вы можете преобразовать любое значение x в строку с помощью String(x) и любое значение y в объект с помощью Object(y).

Имеется еще несколько приемов, которые могут быть полезны для выполнения явных преобразований типов. Для того чтобы преобразовать значение в строку, выполните его конкатенацию с пустой строкой:

Var x_as_string = x + "";

Чтобы преобразовать значение в число, вычтите из него ноль:

Var x_as_number = x - 0;

Принудительно преобразовать какое-либо значение в логическое можно с помощью оператора!, примененного дважды:

Var x_as_boolean = !!x;

Из-за склонности JavaScript к автоматическому преобразованию данных в необходимый в данный момент тип, явные преобразования обычно не требуются. Однако изредка они оказываются полезными, и могут применяться для того, чтобы сделать программу понятнее и точнее.

Преобразование чисел в строки
Преобразование чисел в строки выполняется в JavaScript, возможно, чаще других. Хотя обычно это происходит автоматически, имеется несколько полезных способов явного преобразования этого рода. Два мы уже видели:

Var string_value = String(number); // Использование конструктора String()
// в качестве функции
var string_value = number + ""; // Конкатенация с пустой строкой

Еще одну возможность предоставляет метод toString():

String_value = number.toString();

Метод toString() объекта Number (элементарные числовые значения преобразуются в объекты Number, поэтому вы можете вызвать этот метод) принимает необязательный аргумент, задающий основание системы счисления, в которую будет выполнено преобразование. Если аргумент не указан, преобразование выполняется по основанию 10. Но можно преобразовывать числа и с другими основаниями (между 2 и 36). Например:

Var n = 17;
binary_string = n.toString(2); // Равно "10001"
octal_string = "0" + n.toString(8); // Равно "021"
hex_string = "0x" + n.toString(16); // Равно "0x11"

Недостаток версий JavaScript до версии 1.5 состоит в отсутствии стандартного способа, позволяющего указать количество десятичных знаков в строке, получаемой в результате преобразования числа, или потребовать использования экспоненциальной нотации. Это может усложнить отображение чисел, имеющих традиционные форматы, например денежных значений.

ECMAScript v3 и JavaScript 1.5 обходят это препятствие, добавляя в класс Number три новых метода преобразования числа в строку. Метод toFixed() преобразует число в строку и выводит указанное количество цифр после десятичной точки, не используя экспоненциальной нотации. Метод toExponential() преобразует число в строку, записывая его в экспоненциальной нотации с одной цифрой перед десятичной точкой и указанным количеством цифр после нее. Метод toPrecision() выводит число с помощью указанного количества значащих цифр. Если такого количества значащих цифр недостаточно для вывода целой части числа, оно записывается в экспоненциальной нотации. Обратите внимание, что все три метода корректно округляютфинальные цифры результирующей строки. Посмотрите на следующие примеры:

Var n = 123456.789;
n.toFixed(0); // "123457"
n.toFixed(2); // "123456.79"
n.toExponential(1); // "1.2e+5"
n.toExponential(3); // "1.235e+5"
n.toPrecision(4); // "1.235e+5"
n.toPrecision(7); // "123456.8"

Преобразование строк в числа
Мы видели, что в числовом контексте строки, представляющие числа, автоматически преобразуются в реальные числа. Как было показано выше, это преобразование можно сделать явным:

Var number = Number(string_value);
var number = string_value - 0;

Такое преобразование неудобно из-за своей излишней строгости. Оно работает только с десятичными числами, и хотя преобразование допускает ведущие и замыкающие пробелы, оно не допускает наличия в строке каких-либо непробельных символов после числа. Для более гибких преобразований можно применять функции parseInt() и parseFloat(). Эти функции преобразуют и возвращают любое число, присутствующее в начале строки, игнорируя любые замыкающие нечисловые символы. Функция parseInt() обрабатывает только целые, а parseFloat() – как целые числа, так и числа с плавающей точкой. Если строка начинается с «0x» или «0X», parseInt() интерпретирует ее как шестнадцатеричное число. Например:

ParseInt("3 blind mice"); // Возвращает 3
parseFloat("3.14 meters"); // Возвращает 3.14
parseInt("12.34"); // Возвращает 12
parseInt("0xFF"); // Возвращает 255

Функция parseInt() может иметь второй аргумент, указывающий основание системы счисления обрабатываемого числа. Допустимые значения – от 2 до 36. Например:

ParseInt("11", 2); // Возвращает 3 (1*2 + 1)
parseInt("ff", 16); // Возвращает 255 (15*16 + 15)
parseInt("zz", 36); // Возвращает 1295 (35*36 + 35)
parseInt("077", 8); // Возвращает 63 (7*8 + 7)
parseInt("077", 10); // Возвращает 77 (7*10 + 7)

Если parseInt() и parseFloat() не могут преобразовать указанную строку в число, они возвращают NaN.

ParseInt("eleven"); // Возвращает NaN
parseFloat("$72.47"); // Возвращает NaN

В JavaScript существуют 2 встроенные функции для преобразования строк в числа: parseFloat() и parseInt() .

parseFloat() принимает аргументом строку, которую необходимо привести к численному типу, и возвращает число типа float. Число должно содержаться в начале строки. Если после числа в строке идут ещё какие-то символы, то они отсекаются. Дробная часть числа должна быть записана через точку (запятая не воспринимается как разделитель). В случае, если parseFloat() не может преобразовать строку, то она возвращает NaN.

Также функция может обработать «число n, умноженное на 10 в степени x», которое в программировании принято записывать через букву E, например: 0.5E6 или 0.5E+6. Степень может быть также отрицательная: 0.5E-6, что равно 0.5*10^-6 или 0.5/1000000.

ParseFloat(""3.78kg"") // 3.78 parseFloat(""kg33"") // NaN parseFloat(""0004.111"") // 4.111 parseFloat(""0x66"") // 0 parseFloat("".5"") // 0.5 parseFloat(""-.5"") // -0.5 parseFloat(""0.5e6"") // 500000 parseFloat(""0.03E+2"") // 3 parseFloat(""3E-4"") // 0.0003 parseFloat(""-3E-4"") // -0.0003

Функция parseInt(string[, radix]) принимает в качестве первого аргумента строку, анализирует её и возвращает целое число (тип integer). Функция пытается анализировать систему счисления, в которой записано число в исходной строке (например, десятичная, восьмеричная или шестнадцатеричная — но не только эти). Также систему счисления можно указать явно, передав её вторым параметром radix. Параметр radix может принимать любое число от 2 до 36 (в системах выше 10-й используются буквы английского алфавита, от A до Z).

Числа типа 1.5e6 функция не обрабатывает так, как parseFloat() .

Ознакомьтесь, пожалуйста, с примерами ниже, чтобы не наколоться на подводные камни, запрятаны в работе функции parseInt() .

ParseInt(""25"") // 25 parseInt(""-25"") // -25 parseInt(""45.12"") // 45 parseInt(""045"",10) // 45 parseInt(""70"",8) // 56 (70 в восьмеричной системе это 56 в десятичной) parseInt(""070"") // 56 (ВАЖНО!!! нуль вначале заставит функцию проанализировать строку как восьмеричное число) parseInt(""88"",8) // NaN (в восьмеричной системе нет цифры 8) parseInt(""a1"") // NaN (ВАЖНО!!! Функция по умолчанию не воспринимает число как 16-ричное, если не дописать в начале строки 0x) parseInt(""a1"",16) // 161 (здесь явно указана система счисления) parseInt(""0xa1"") // 161 (правильный формат 16-ричного числа, можно не указывать второй параметр) parseInt(""099"") // 0 (ВАЖНО!!! Число воспринимается как восьмеричное, но содержащее недопустимые символы) parseInt(""0.5e6"") // 0 (ВАЖНО!!! не работает как parseFloat) parseInt(""ZZ"",36) // 1295 parseInt(""-FF"") // NaN parseInt(""-FF"",16) // -255

Если Вы обрабатываете данные из текстового поля, которые вводит пользователь, всегда используйте parseInt() вместе со вторым параметром radix, это обезопасит Ваш код от неожиданных результатов.

| |

В JavaScript данные делятся на типы, что помогает группировать данные и определить, какие значения можно присвоить и какие операции можно выполнить.

Хотя из-за приведения типов JavaScript преобразовывает многие значения автоматически, для достижения ожидаемых результатов лучше всего преобразовывать типы данных вручную.

Этот мануал научит преобразовать примитивные типы данных JavaScript, включая числа, строки и логические элементы.

Неявное преобразование

Язык программирования JavaScript очень хорошо справляется с обработкой неожиданных значений. JavaScript не отклоняет неожиданные значения, а пытается преобразовать. Это неявное преобразование также называется приведением типов (type coercion).

Отдельные методы автоматически преобразовывают значения, чтобы использовать их. Метод alert() принимает строку в качестве своего параметра, а другие типы автоматически преобразует в строки. Таким образом, можно передать этому методу числовое значение:

Если запустить эту строку, браузер вернет всплывающее окно со значением 8.5, которое будет уже преобразовано в строку.

Используя строки, состоящие из чисел, вместе с математическими операторами, вы обнаружите, что JavaScript может обрабатывать значения, неявно преобразовывая строки в числа:

// Вычитание
"15" - "10";
5
// Модуль
"15" % "10";
5

Но не все операторы работают предсказуемо. Особенно это касается оператора +: он выполняет сложение чисел и конкатенацию строк.

// При работе со строками + выполняет конкатенацию
"2" + "3";
"23"

Поскольку оператор + имеет много предназначений, в этом примере он воспринимает значения 2 и 3 как строковые, несмотря на то, что они выражаются числовыми строками. Потому он объединяет строки «2» и «3» и получает 23, а не складывает 2 и 3 и получает 5.

Подобная неоднозначность имеет место в коде и иногда вызывает неожиданные результаты, потому лучше по возможности явно преобразовывать типы данных. Это поможет в поддержке кода и обработке ошибок.

Преобразование значений в строки

Чтобы явно преобразовать значение в строку, вызовите метод String() или n.toString().

Попробуйте преобразовать логическое значение true в строку с помощью String().

Это вернет строковый литерал «true».

Также можно попробовать передать функции число:

Она вернет строковый литерал:

Теперь попробуйте использовать String() с переменной. Присвойте числовое значение переменной odyssey и используйте оператор typeof, чтобы проверить тип.

let odyssey = 2001;
console.log(typeof odyssey);
number

На данный момент переменной odyssey присвоено числовое значение 2001. Оператор typeof подтверждает, что значение является числом.

Теперь присвойте переменной odyssey ее эквивалент внутри функции String(), а затем используйте typeof, чтобы убедиться, что значение переменной успешно преобразовано из числа в строку.

odyssey = String(odyssey); // "2001"
console.log(typeof odyssey);
string

Как видите, теперь переменная odyssey содержит строку.

Функция n.toString() работает аналогичным образом. Замените n переменной.

let blows = 400;
blows.toString();

Переменная blows будет содержать строку.

Вместо переменной можно поместить значение в круглых скобках:

(1776).toString(); // returns "1776"
(false).toString(); // returns "false"
(100 + 200).toString(); // returns "300"

String() и n.toString() явно преобразовывают логические и числовые значения в строки.

Преобразование значений в числа

Метод Number() может преобразовать значение в число. Часто возникает необходимость преобразовать строки, состоящие из чисел, но иногда преобразовывать нужно и логические значения.

Для примера передайте методу Number() такую строку:

Строка будет преобразована в число и больше не будет заключена в кавычки.

Также можно присвоить строку переменной и затем преобразовать ее.

let dalmatians = "101";
Number(dalmatians);
101

Строковый литерал «101» был преобразован в число 101.

Строки из пробелов или пустые строки будут преобразованы в число 0.

Number(" "); // returns 0
Number(""); // returns 0

Имейте в виду, что строки, которыйе не состоят из чисел, преобразуются в NaN, что означает Not a Number. Это относится и к числам, разделенным пробелами.

Number("twelve"); // returns NaN
Number("20,000"); // returns NaN
Number("2 3"); // returns NaN
Number("11-11-11"); // returns NaN

В логических данных значение false будет равно 0, а true будет равно 1.

Преобразование значений в логические значения

Чтобы преобразовать числа или строки в логические значения, используется метод Boolean(). К примеру, это помогает определить, вводит пользователь данные в текстовое поле или нет.

Любое значение, которое интерпретируется как пустое, например, число 0, пустая строка, значения undefined, NaN или null преобразуются в значение false.

Boolean(0); // returns false
Boolean(""); // returns false
Boolean(undefined); // returns false
Boolean(NaN); // returns false
Boolean(null); // returns false

Другие значения, включая строковые литералы, состоящие из пробелов, будут преобразованы в true.

Boolean(2000); // returns true
Boolean(" "); // returns true
Boolean("Maniacs"); // returns true

Обратите внимание: строковый литерал «0» преобразовывается в true, поскольку это не пустое значение:

Boolean("0"); // returns true

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

Заключение

Теперь вы знаете, как JavaScript преобразовывает типы данных. часто из-за приведения типов данные преобразовываются неявно, что может стать причиной возникновения неожиданных значений. Рекомендуется явно преобразовывать типы данных, чтобы гарантировать корректную работу программ.