- Преобразование типов для примитивов
- Строковое преобразование
- Численное преобразование
- Специальные значения
- Логическое преобразование
- Итого
- Преобразование типов
- Строковое преобразование
- Численное преобразование
- Логическое преобразование
- Итого
- JavaScript конвертируем числа в строки
- Сравнение типов данных в JavaScript
- Преобразование числа в строку
- .toString()
- String()
- Шаблон строки
- Конкатенация пустой строки
- Заключение
Преобразование типов для примитивов
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/type-conversions.
Система преобразования типов в JavaScript очень проста, но отличается от других языков. Поэтому она часто служит «камнем преткновения» для приходящих из других языков программистов.
Всего есть три преобразования:
- Строковое преобразование.
- Численное преобразование.
- Преобразование к логическому значению.
Эта глава описывает преобразование только примитивных значений, объекты разбираются далее.
Строковое преобразование
Строковое преобразование происходит, когда требуется представление чего-либо в виде строки. Например, его производит функция alert .
var a = true; alert( a ); // "true"
Можно также осуществить преобразование явным вызовом String(val) :
alert( String(null) === "null" ); // true
Как видно из примеров выше, преобразование происходит наиболее очевидным способом, «как есть»: false становится «false» , null – «null» , undefined – «undefined» и т.п.
Также для явного преобразования применяется оператор «+» , у которого один из аргументов строка. В этом случае он приводит к строке и другой аргумент, например:
alert( true + "test" ); // "truetest" alert( "123" + undefined ); // "123undefined"
Численное преобразование
Численное преобразование происходит в математических функциях и выражениях, а также при сравнении данных различных типов (кроме сравнений === , !== ).
Для преобразования к числу в явном виде можно вызвать Number(val) , либо, что короче, поставить перед выражением унарный плюс «+» :
var a = +"123"; // 123 var a = Number("123"); // 123, тот же эффект
Значение | Преобразуется в. |
---|---|
undefined | NaN |
null | 0 |
true / false | 1 / 0 |
Строка | Пробельные символы по краям обрезаются. Далее, если остаётся пустая строка, то 0 , иначе из непустой строки «считывается» число, при ошибке результат NaN . |
// после обрезания пробельных символов останется "123" alert( +" \n 123 \n \n" ); // 123
alert( +true ); // 1 alert( +false ); // 0
alert( "\n" == false ); alert( "1" == true );
Специальные значения
Посмотрим на поведение специальных значений более внимательно.
Интуитивно, значения null/undefined ассоциируются с нулём, но при преобразованиях ведут себя иначе.
Специальные значения преобразуются к числу так:
Значение | Преобразуется в. |
---|---|
undefined | NaN |
null | 0 |
Это ведёт к забавным последствиям.
Например, null не подчиняется законам математики – он «больше либо равен нулю»: null>=0 , но не больше и не равен:
alert( null >= 0 ); // true, т.к. null преобразуется к 0 alert( null > 0 ); // false (не больше), т.к. null преобразуется к 0 alert( null == 0 ); // false (и не равен!), т.к. == рассматривает null особо.
Значение undefined вообще «несравнимо»:
alert( undefined > 0 ); // false, т.к. undefined -> NaN alert( undefined == 0 ); // false, т.к. это undefined (без преобразования) alert( undefined < 0 ); // false, т.к. undefined ->NaN
Для более очевидной работы кода и во избежание ошибок лучше не давать специальным значениям участвовать в сравнениях > >= <
Используйте в таких случаях переменные-числа или приводите к числу явно.
Логическое преобразование
Преобразование к true/false происходит в логическом контексте, таком как if(value) , и при применении логических операторов.
Все значения, которые интуитивно «пусты», становятся false . Их несколько: 0 , пустая строка, null , undefined и NaN .
Остальное, в том числе и любые объекты – true .
Полная таблица преобразований:
Значение | Преобразуется в. |
---|---|
undefined , null | false |
Числа | Все true , кроме 0 , NaN — false . |
Строки | Все true , кроме пустой строки «» — false |
Объекты | Всегда true |
Для явного преобразования используется двойное логическое отрицание !!value или вызов Boolean(value) .
В отличие от многих языков программирования (например PHP), «0» в JavaScript является true , как и строка из пробелов:
alert( !!"0" ); // true alert( !!" " ); // любые непустые строки, даже из пробелов - true!
Логическое преобразование интересно тем, как оно сочетается с численным.
Два значения могут быть равны, но одно из них в логическом контексте true , другое – false .
Например, равенство в следующем примере верно, так как происходит численное преобразование:
… А в логическом контексте левая часть (0) даст false , правая («\n0\n») – true , так как любая не пустая строка в логическом контексте равна true :
С точки зрения преобразования типов в JavaScript это совершенно нормально. При сравнении с помощью «==» – численное преобразование, а в if – логическое, только и всего.
Итого
В JavaScript есть три преобразования:
- Строковое: String(value) – в строковом контексте или при сложении со строкой. Работает очевидным образом.
- Численное: Number(value) – в численном контексте, включая унарный плюс +value . Происходит при сравнении разных типов, кроме строгого равенства.
- Логическое: Boolean(value) – в логическом контексте, можно также сделать двойным НЕ: !!value .
Точные таблицы преобразований даны выше в этой главе.
Особым случаем является проверка равенства с null и undefined . Они равны друг другу, но не равны чему бы то ни было ещё, этот случай прописан особо в спецификации.
Преобразование типов
Чаще всего операторы и функции автоматически приводят переданные им значения к нужному типу.
Например, alert автоматически преобразует любое значение к строке. Математические операторы преобразуют значения к числам.
Есть также случаи, когда нам нужно явно преобразовать значение в ожидаемый тип.
В этой главе мы не касаемся объектов. Сначала мы разберём преобразование примитивных значений.
Мы разберём преобразование объектов позже, в главе Преобразование объектов в примитивы.
Строковое преобразование
Строковое преобразование происходит, когда требуется представление чего-либо в виде строки.
Например, alert(value) преобразует значение к строке.
Также мы можем использовать функцию String(value) , чтобы преобразовать значение к строке:
let value = true; alert(typeof value); // boolean value = String(value); // теперь value это строка "true" alert(typeof value); // string
Преобразование происходит очевидным образом. false становится «false» , null становится «null» и т.п.
Численное преобразование
Численное преобразование происходит в математических функциях и выражениях.
Например, когда операция деления / применяется не к числу:
alert( "6" / "2" ); // 3, строки преобразуются в числа
Мы можем использовать функцию Number(value) , чтобы явно преобразовать value к числу:
let str = "123"; alert(typeof str); // string let num = Number(str); // становится числом 123 alert(typeof num); // number
Явное преобразование часто применяется, когда мы ожидаем получить число из строкового контекста, например из текстовых полей форм.
Если строка не может быть явно приведена к числу, то результатом преобразования будет NaN . Например:
let age = Number("Любая строка вместо числа"); alert(age); // NaN, преобразование не удалось
Правила численного преобразования:
Значение | Преобразуется в… |
---|---|
undefined | NaN |
null | 0 |
true / false | 1 / 0 |
string | Пробельные символы (пробелы, знаки табуляции \t , знаки новой строки \n и т. п.) по краям обрезаются. Далее, если остаётся пустая строка, то получаем 0 , иначе из непустой строки «считывается» число. При ошибке результат NaN . |
alert( Number(" 123 ") ); // 123 alert( Number("123z") ); // NaN (ошибка чтения числа на месте символа "z") alert( Number(true) ); // 1 alert( Number(false) ); // 0
Учтите, что null и undefined ведут себя по-разному. Так, null становится нулём, тогда как undefined приводится к NaN .
Большинство математических операторов также производит данное преобразование, как мы увидим в следующей главе.
Логическое преобразование
Логическое преобразование самое простое.
Происходит в логических операциях (позже мы познакомимся с условными проверками и подобными конструкциями), но также может быть выполнено явно с помощью функции Boolean(value) .
- Значения, которые интуитивно «пустые», вроде 0 , пустой строки, null , undefined и NaN , становятся false .
- Все остальные значения становятся true .
alert( Boolean(1) ); // true alert( Boolean(0) ); // false alert( Boolean("Привет!") ); // true alert( Boolean("") ); // false
Некоторые языки (к примеру, PHP) воспринимают строку «0» как false . Но в JavaScript, если строка не пустая, то она всегда true .
alert( Boolean("0") ); // true alert( Boolean(" ") ); // пробел это тоже true (любая непустая строка это true)
Итого
Существует 3 наиболее широко используемых преобразования: строковое, численное и логическое.
Строковое – Происходит, когда нам нужно что-то вывести. Может быть вызвано с помощью String(value) . Для примитивных значений работает очевидным образом.
Численное – Происходит в математических операциях. Может быть вызвано с помощью Number(value) .
Преобразование подчиняется правилам:
Значение | Становится… |
---|---|
undefined | NaN |
null | 0 |
true / false | 1 / 0 |
string | Пробельные символы по краям обрезаются. Далее, если остаётся пустая строка, то получаем 0 , иначе из непустой строки «считывается» число. При ошибке результат NaN . |
Логическое – Происходит в логических операциях. Может быть вызвано с помощью Boolean(value) .
Значение | Становится… |
---|---|
0 , null , undefined , NaN , «» | false |
любое другое значение | true |
Большую часть из этих правил легко понять и запомнить. Особые случаи, в которых часто допускаются ошибки:
- undefined при численном преобразовании становится NaN , не 0 .
- «0» и строки из одних пробелов типа » » при логическом преобразовании всегда true .
В этой главе мы не говорили об объектах. Мы вернёмся к ним позже, в главе Преобразование объектов в примитивы, посвящённой только объектам, сразу после того, как узнаем больше про основы JavaScript.
JavaScript конвертируем числа в строки
Управление данными является одной из фундаментальных концепций программирования. Из-за этого JavaScript предлагает множество инструментов для анализа различных типов данных, что позволяет легко обмениваться форматами данных. В частности, в этой статье я расскажу о том, как преобразовать число в строку. В другой статье я также расскажу, как преобразовать строку в число в JavaScript.
Сравнение типов данных в JavaScript
JavaScript — это универсальный язык, который позволяет программисту контролировать, насколько строгой будет типизация данных.
Существует два основных способа сравнения между двумя структурами / элементами данных: два знака равенства (==) или три знака равенства (===).
При использовании двух знаков равенства переменные сравниваются только по их содержанию. В этом примере будет использоваться троичный оператор, который является предпочтительным.
let a = 10; let b = '10'; a == b ? console.log('Equal!') : console.log('Different!'); // Equal!
С другой стороны, при использовании трех знаков равенства переменные сравниваются по содержанию и типу данных:
let a = 50; let b = '50'; a === b ? console.log('Equal!') : console.log('Different!'); // Different!
Преобразование числа в строку
В JavaScript есть несколько встроенных методов, которые обеспечивают преобразование числового типа данных в строку, которые отличаются только производительностью и удобочитаемостью.
.toString()
Метод .toString(), который принадлежит объекту Number.prototype, принимает целое число или число с плавающей запятой и преобразует его в тип String.
Есть несколько способов вызова этого метода. Если число (основание) передается в качестве параметра методу .toString(), число будет проанализировано и преобразовано в это базовое число:
let a = 20 a.toString(); // '20' 50 .toString(); // '50' (60).toString(); // '60' (7).toString(2); // '111' (7 в двоичном представлении)
String()
Метод String() создает примитивный тип String для переданного ему числа:
let a = 30; String(a); // '30' String(24); // '24' String(35.64); // '35.64'
Основное отличие здесь состоит в том, что объект String не выполняет никаких базовых преобразований, как Number.toString().
Шаблон строки
С введением шаблонных строк в ES6 введение числа внутри String является допустимым способом парсинга типа данных Integer или Float:
let num = 50; let flt = 50.205; let string = `$`; // '50' let floatString = `$`; // '50.205'
Конкатенация пустой строки
Наконец, что не менее важно, есть отличный способ создать строку из числа. Возможно, это один из наиболее ориентированных на производительность способов, хотя некоторая читаемость нарушена:
В зависимости от браузера, на котором работает этот код, это может быть самый быстрый способ преобразования числа в строку. Но также имейте в виду, что этот метод не всегда возвращает желаемую строку. Например:
Заключение
Есть много действительных способов манипулирования данными. Программист сам решает, какой из них выбрать, выбирая производительность, а не читабельность или баланс между ними.