Лекция
Привет, сегодня поговорим про преобразование типов для примитивов, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое преобразование типов для примитивов , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend).
Система преобразования типов в JavaScript очень проста, но отличается от других языков. Поэтому она часто служит «камнем преткновения» для приходящих из других языков программистов.
Всего есть три преобразования:
Эта статья описывает преобразование примитивных значений, объекты разбираются далее в учебнике.
Строковое преобразование происходит, когда требуется представление чего-либо в виде строки. Например, его производит функция alert
.
1 |
var a = true ; |
2 |
3 |
alert(a); // "true" |
Можно также осуществить преобразование явным вызовом String(val)
:
1 |
alert( String( null ) === "null" ); // true |
Также для явного преобразования применяется оператор "+"
, у которого один из аргументов строка. В этом случае он приводит к строке и другой аргумент, например:
1 |
alert( true + "test" ); // "truetest" |
2 |
alert( "123" + undefined ); // "123undefined" |
Численное преобразование происходит в математических функциях и выражениях, а также при сравнении данных различных типов (кроме сравнений ===
, !==
).
Для преобразования к числу в явном виде можно вызвать Number(val)
, либо, что короче, поставить перед выражением оператор унарный плюс "+"
:
var a = + "\n123\n" ; // 123 |
var a = Number( "\n123\n" ); // 123, тот же эффект |
Значение | Преобразуется в… |
---|---|
undefined |
NaN |
null |
0 |
true / false |
1 / 0 |
Строка | Пробелы по краям обрезаются. Далее, если остается пустая строка, то 0 .Из непустой строки «считывается» число, при ошибке результат: NaN . |
Примеры:
1 |
alert( + true ); // 1 |
2 |
alert( + false ); // 0 |
1 |
alert( "\n0\n" == 0 ); // true |
При этом строка "\n0\n"
преобразуется к числу — начальные и конечные пробелы игнорируются, получается 0
.
1 |
alert( "\n" == false ); |
Здесь сравнение ==
снова приводит обе части к числу. И слева и справа получается 0
.
По аналогичной причине верно равенство "1" == true
.
Посмотрим на поведение специальных значений более внимательно.
Интуитивно, значения null/undefined
ассоциируются с нулем, но при преобразованиях ведут себя иначе.
Специальные значения преобразуются к числу так:
Значение | Преобразуется в… |
---|---|
undefined |
NaN |
null |
0 |
Это преобразование осуществляется при арифметических операциях и сравнениях > >= < <=
, но не при проверке равенства ==
. Алгоритм проверки равенства для этих значений в спецификации прописан отдельно (пункт 11.9.3). В нем считается, что null
и undefined
равны "=="
между собой, но эти значения не равны никакому другому значению.
Это ведет к забавным последствиям.
Например, null
не подчиняется законам математики — он «больше либо равен нулю»: null>=0
, но не больше и не равен:
1 |
alert( null >= 0); // true, т.к. Об этом говорит сайт https://intellect.icu . null преобразуется к 0 |
2 |
alert( null > 0); // false (не больше), т.к. null преобразуется к 0 |
3 |
alert( null == 0 ); // false (и не равен!), т.к. == рассматривает null особо. |
Значение undefined
вообще вне сравнений:
1 |
alert( undefined > 0); // false, т.к. undefined -> NaN |
2 |
alert( undefined == 0); // false, т.к. это undefined (без преобразования) |
3 |
alert( undefined < 0); // false, т.к. undefined -> NaN |
Для более очевидной работы кода и во избежание ошибок лучше не давать специальным значениям участвовать в сравнениях > >= < <=
.
Используйте в таких случаях переменные-числа или приводите к числу явно.
Преобразование к true/false
происходит в логическом контексте, таком как if(obj)
, while(obj)
и при применении логических операторов.
Все значения, которые интуитивно «пусты», становятся false
. Их несколько: 0
, пустая строка, null
,undefined
и NaN
.
Остальное, в том числе и любые объекты — true
.
Полная таблица преобразований:
Значение | Преобразуется в… |
---|---|
undefined , null |
false |
Числа | Все true , кроме 0 , NaN — false . |
Строки | Все true , кроме пустой строки "" — false |
Объекты | Всегда true |
Для явного преобразования используется двойное логическое отрицание !!value
или вызовBoolean(value)
.
"0"
становится true
В отличие от многих языков программирования (например PHP), "0"
в JavaScript является true
, как и строка из пробелов:
1 |
alert( !! "0" ); // true |
2 |
alert( !! " " ); // любые непустые строки, даже из пробелов - true! |
true
Также, в отличие от ряда других языков программирования, пустой объект {}
или массив []
являются true
:
1 |
if ( {} ) { |
2 |
alert( "{} -> true" ); |
3 |
} |
4 |
5 |
if ( [] ) { |
6 |
alert( "[] -> true" ); |
7 |
} |
Логическое преобразование интересно тем, как оно сочетается с численным.
Два значения могут быть равны, но одно из них в логическом контексте true
, другое — false
.
Например, равенства в следующем примере верны, так как происходит численное преобразование:
1 |
alert( 0 == "\n0\n" ); // true |
2 |
alert( false == " " ); // true |
…А в логическом контексте левая часть даст false
, правая — true
:
1 |
if ( "\n0\n" ) { |
2 |
alert( "true, совсем не как 0!" ); |
3 |
} |
if
— логическое, только и всего.
В JavaScript есть три преобразования:
String(value)
— в строковом контексте или при сложении со строкойNumber(value)
— в численном контексте, включая унарный плюс +value
.Boolean(value)
— в логическом контексте, можно также сделать двойным НЕ:!!value
.Сравнение не осуществляет преобразование типов в следующих случаях:
true > "000"
станет 1 > 0
.null
и undefined
. Они равны друг другу, но не равны чему бы то ни было еще, этот случай прописан особо в спецификации.
К сожалению, в одной статье не просто дать все знания про преобразование типов для примитивов. Но я - старался. Если ты проявишь интерес к раскрытию подробностей,я обязательно напишу продолжение! Надеюсь, что теперь ты понял что такое преобразование типов для примитивов и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)
Из статьи мы узнали кратко, но содержательно про преобразование типов для примитивов
Комментарии
Оставить комментарий
Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)
Термины: Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)