Типы данных
Динамическая типизация
JavaScript является слабо типизированным или динамическим языком. Это значит, что вам не нужно определять тип переменной заранее. Тип определится автоматически во время выполнения программы. Также это значит, что вы можете использовать одну переменную для хранения данных различных типов:
Все типы данных в JavaScript, кроме объектов, являются иммутабельными (значения не могут быть модифицированы, а только перезаписаны новым полным значением)
Литералы
Самое популярное определение: Литералы используются в тексте программы для обозначения числовых значений, строк, символов или логических констант. Другими словами литерал представляет собой постоянное значение, у которого нет имени.
В нашем случае понятие литерала немного отличное. Мы можем представить, что литерал это способ объявления значения какого-либо типа в коде.
Основные типы
В JS 6 основных типов данных:
Number
(числа)String
(строки)Boolean
(true
/false
)null
undefined
Object
Примитивы
- Числа (
Number
) - Строки (
String
) - Булевые значения (
Boolean
) - Null (
Null
) - Undefined (
Undefined
)
Object и объектные типы
- Объекты (
Object
) - Массивы (
Array
)
Как узнать тип переменной или от чего она наследуется
Про операторы касающиеся наследования мы будем говорить потом
Чтобы узнать тип переменной имеется оператор typeof
Для того чтобы узнать от какого типа наследуется значение, можно воспользоваться оператором instanceof
;
Пример, где мы использовали typeof
Приведение типов
Приведение типов — это процесс преобразования значений из одного типа в другой (например — строки в число, объекта — в логическое значение, и так далее). Любой тип в JavaScript, идёт ли речь о примитивном типе, или об объекте, может быть преобразован в другой тип. Напомним, что примитивными типами данных в JS являются Number, String, Boolean, Null, Undefined.
Существует 3 варианта преобразования:
- В
String
- В
Number
- В
Boolean
И несколько правил того как это происходит:
Преобразование в
String
, когда вы используете оператор конкатенации строк.note
Напомню, что у нас знак
+
отвечает за оператора: - Конкатенация строк - Арифметическое сложениеВполне естественно, что оператор
+
считается оператором конкатенации, если один из операндов является строкой.10 + 5; // это операция сложения и для нас сюрпризов нет10 + "5"; // это уже интереснее потому что один из операндов является строкой, а значит и + отвечает сейчас за конкатенациюКак преобразовываются примитивы в
String
:String(123); // '123'String(-12.3); // '-12.3'String(null); // 'null'String(undefined); // 'undefined'String(true); // 'true'String(false);Преобразование типа к
Boolean
По этому пункту есть интересный момент с тем, что неявное преобразование к
Boolean
, происходят фоном если мы используем конструкциюif/else
или логические операторы||
,&&
,!
.Как преобразовываются примитивы в
Boolean
:Boolean(""); // falseBoolean(0); // falseBoolean(-0); // falseBoolean(NaN); // falseBoolean(null); // falseBoolean(undefined); // falseBoolean(false); // falseПреобразование к
Number
Здесь правила более объемные, давайте по пунктам:
- Операторы сравнения (>, <, <=, >=).
- Побитовые операторы (|, &, ^, ~).
- Арифметические операторы (-, +, *, /, %). Обратите внимание на то, что оператор + с двумя операндами не вызывает неявное преобразование к числовому типу, если хотя бы один оператор является строкой.
- Унарный оператор +.
- Оператор нестрогого равенства == (а также !=). Обратите внимание на то, что оператор == не производит неявного преобразования в число, если оба операнда являются строками.
Number("123") + "123"; // явное преобразование // неявное преобразование123 != "456"; // неявное преобразование4 > "5"; // неявное преобразование5 / null; // неявное преобразованиеtrue | 0; // неявное преобразование