Типы данных

Динамическая типизация

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

var foo = 42; // сейчас foo типа Number
foo = "bar"; // а теперь foo типа String
foo = true; // foo становится типа Boolean

Все типы данных в JavaScript, кроме объектов, являются иммутабельными (значения не могут быть модифицированы, а только перезаписаны новым полным значением)

Литералы

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

В нашем случае понятие литерала немного отличное. Мы можем представить, что литерал это способ объявления значения какого-либо типа в коде.

var s = ""; // Строковый литерал
var n = 15.6; // Числовой литерал
var b = true; // Булевый литерал
var z = null; // Литерал null
var o = { a: 1, b: 2 }; // Объектный литерал
var a = [1, 2, 3]; // Литерал массива

Основные типы

В JS 6 основных типов данных:

  1. Number (числа)
  2. String (строки)
  3. Boolean (true/false)
  4. null
  5. undefined
  6. Object

Примитивы

  • Числа (Number)
  • Строки (String)
  • Булевые значения (Boolean)
  • Null (Null)
  • Undefined (Undefined)

Object и объектные типы

  • Объекты (Object)
  • Массивы (Array)

Как узнать тип переменной или от чего она наследуется

Про операторы касающиеся наследования мы будем говорить потом

Чтобы узнать тип переменной имеется оператор typeof

var declaredButUndefinedVariable;
console.log(typeof 42); // "number"
console.log(typeof "blubber"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof declaredButUndefinedVariable); // "undefined"
console.log(typeof {}); // "object"
console.log(typeof []); // "object" Обратите внимание, что Array это объект!

Для того чтобы узнать от какого типа наследуется значение, можно воспользоваться оператором instanceof;

VLZH/jslessons

Пример, где мы использовали 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(""); // false
    Boolean(0); // false
    Boolean(-0); // false
    Boolean(NaN); // false
    Boolean(null); // false
    Boolean(undefined); // false
    Boolean(false); // false
  • Преобразование к Number

    Здесь правила более объемные, давайте по пунктам:

    • Операторы сравнения (>, <, <=, >=).
    • Побитовые операторы (|, &, ^, ~).
    • Арифметические операторы (-, +, *, /, %). Обратите внимание на то, что оператор + с двумя операндами не вызывает неявное преобразование к числовому типу, если хотя бы один оператор является строкой.
    • Унарный оператор +.
    • Оператор нестрогого равенства == (а также !=). Обратите внимание на то, что оператор == не производит неявного преобразования в число, если оба операнда являются строками.
    Number("123") + "123"; // явное преобразование // неявное преобразование
    123 != "456"; // неявное преобразование
    4 > "5"; // неявное преобразование
    5 / null; // неявное преобразование
    true | 0; // неявное преобразование