Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Преобразование типов для примитивов

Лекция



Привет, сегодня поговорим про преобразование типов для примитивов, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое преобразование типов для примитивов , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend).


  1. Строковое преобразование
  2. Численное преобразование
    1. Специальные значения
  3. Логическое преобразование
  4. Итого

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

Всего есть три преобразования:

  1. Cтроковое преобразование.
  2. Числовое преобразование.
  3. Преобразование к логическому значению.

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

Строковое преобразование

Строковое преобразование происходит, когда требуется представление чего-либо в виде строки. Например, его производит функция 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.

Полная таблица преобразований:

ЗначениеПреобразуется в…
undefinednull false
Числа Все true, кроме 0NaN — 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 }
С точки зрения преобразования типов в JavaScript это совершенно нормально. При равенстве — численное преобразование, а в if — логическое, только и всего.

 

Итого

В JavaScript есть три преобразования:

  1. Строковое: String(value) — в строковом контексте или при сложении со строкой
  2. Численное: Number(value) — в численном контексте, включая унарный плюс +value.
  3. Логическое: Boolean(value) — в логическом контексте, можно также сделать двойным НЕ:!!value.

Сравнение не осуществляет преобразование типов в следующих случаях:

  • При сравнении объектов. Две переменные, которые являются объектами равны только, когда ссылаются на один и тот же объект.
  • При сравнении двух строк. Там отдельный алгоритм сравнения. А вот если хоть один операнд — не строка, то значения будут приведены: true > "000" станет 1 > 0.
  • При проверке равенства с null и undefined. Они равны друг другу, но не равны чему бы то ни было еще, этот случай прописан особо в спецификации.

 

Важность: 5

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

01 "" + 1 + 0
02 "" - 1 + 0
03 true false
04 6 / "3"
05 "2" "3"
06 4 + 5 + "px"
07 "$" + 4 + 5

08 "4" - 2

09 "4px" - 2

10 7 / 0

11 parseInt("09")

12 "  -9\n" + 5
13 "  -9\n" - 5
14 5 && 2

15 2 && 5

16 5 || 0

17 0 || 5
18 null + 1
19 undefined + 1

 

Решение

 

01 "" + 1 + 0 = "10"   // (1)
02 "" - 1 + 0 = -1   // (2)
03 true false = 1
04 6 / "3" = 2
05 "2" "3" = 6
06 4 + 5 + "px" "9px"
07 "$" + 4 + 5
 = "$45"
08 "4" - 2
 = 2
09 "4px" - 2
 = NaN
10 7 / 0
 = Infinity
11 parseInt("09")
 = "0" или "9" // (3)
12 " -9\n" + 5 = " -9\n5"
13 " -9\n" - 5 = -14
14 5 && 2
 = 2
15 2 && 5
 = 5
16 5 || 0
 = 5
17 0 || 5 = 5
18 null + 1 = 1 // (4)
19 undefined + 1 = NaN // (5)

 

  1. Оператор "+" в данном случае прибавляет 1 как строку, и затем 0.
  2. Оператор "-" работает только с числами, так что он сразу приводит "" к 0.
  3. В некоторых браузерах parseInt без второго аргумента интерпретирует 09 как восьмиричное число.
  4. null при численном преобразовании становится 0
  5. undefined при численном преобразовании становится NaN
[Открыть за

К сожалению, в одной статье не просто дать все знания про преобразование типов для примитивов. Но я - старался. Если ты проявишь интерес к раскрытию подробностей,я обязательно напишу продолжение! Надеюсь, что теперь ты понял что такое преобразование типов для примитивов и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)

Из статьи мы узнали кратко, но содержательно про преобразование типов для примитивов
создано: 2014-10-07
обновлено: 2024-11-14
255



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)

Термины: Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)