JS Basics - Data types & type conversion & operators Flashcards
Типы данных
Всего 8 типов данных.
7 примитивных:
1. Number;
2. String;
3. Boolean;
4. Null;
5. Undefined;
6. Symbol;
7. BigInt.
Один не примитивный тип:
Object.
Все примитивы присваиваются по значению, все объекты присваивают по ссылке. Т.е. если мы присваиваем переменной значение объекта, то это значение не котируется, а отображается как ссылка на изначальный объект.
Number
Числовой тип данных (number) представляет как целочисленные значения, так и числа с плавающей точкой.
Кроме обычных чисел, существуют так называемые «специальные числовые значения», которые относятся к этому типу данных: Infinity, -Infinity и NaN.
Математические операции – безопасны
Математические операции в JavaScript «безопасны». Мы можем делать что угодно: делить на ноль, обращаться с нечисловыми строками как с числами и т.д.
Скрипт никогда не остановится с фатальной ошибкой (не «умрёт»). В худшем случае мы получим NaN как результат выполнения.
Infiniti
Специальное числовое значение, которое представляет собой математическую бесконечность ∞. Это особое значение, которое больше любого числа.
Мы можем получить его в результате деления на ноль:
alert( 1 / 0 ); // Infinity
Или задать его явно:
alert( Infinity ); // Infinity
NaN
Специальное числовое значение, которое означает вычислительную ошибку. Это результат неправильной или неопределённой математической операции, например:
alert( “не число” / 2 ); // NaN, такое деление является ошибкой.
Значение NaN «прилипчиво». Любая математическая операция с NaN возвращает NaN:
alert( NaN + 1 ); // NaN
alert( “не число” / 2 - 1 ); // NaN
Если где-то в математическом выражении есть NaN, то оно распространяется на весь результат (есть только одно исключение: NaN ** 0 равно 1).
String
Строка должна быть заключена в кавычки.
В JS существует три типа кавычек.
Двойные кавычки: “Привет”.
Одинарные кавычки: ‘Привет’.
Обратные кавычки: Привет
.
Двойные или одинарные кавычки являются «простыми», между ними нет разницы.
Обратные же кавычки имеют расширенную функциональность. Они позволяют нам встраивать выражения в строку, заключая их в ${…} (интерполяция). Мы можем положить туда всё, что угодно: переменную name, или выражение 1 + 2, или что-то более сложное.
Строка может содержать ноль символов (быть пустой), один символ или множество.
Boolean
Булевый тип (boolean) может принимать только два значения: true (истина) и false (ложь).
Такой тип, как правило, используется для хранения значений да/нет: true значит «да, правильно», а false значит «нет, не правильно».
Булевые значения также могут быть результатом сравнений:
let isGreater = 4 > 1;
alert( isGreater ); // true (результатом сравнения будет “да”)
Boolean type conversion:
False: false, null, undefined, “ “, 0, NaN
True: ‘false’ (т.к. не пустая строка), ‘0’, {} (пустой объект, но объект), everything else.
Boolean function
Boolean(value) - значение, отправленное в функцию будет преобразовано либо в true, либо в false, по правилам boolean type conversion.
Вместо конструктора boolean чаще используют двойное отрицание - !!. Первое отрицание работает как отрицание, а второе возвращает обратное значение.
Например let booleanLet = !!’false’ // true (т.к. строка).
Null
Специальное значение null формирует отдельный тип, который содержит только значение null:
let age = null;
В JS null не является «ссылкой на несуществующий объект» или «нулевым указателем», как в некоторых других языках.
Это просто специальное значение, которое представляет собой «ничего», «пусто» или «значение неизвестно».
В приведённом выше коде указано, что значение переменной age неизвестно.
В контексте чисел null это 0, но
typeof null == ‘object’ // true
Specification bug:
null == 0; // false
null > 0; // false
null >= 0; // true
Undefined
Специальное значение undefined также стоит особняком и формирует тип из самого себя. Undefined это и тип и значение.
Оно означает, что «значение не было присвоено».
Если переменная объявлена, но ей не присвоено никакого значения, то её значением будет undefined.
Технически мы можем присвоить значение undefined любой переменной, но так делать не рекомендуется. Обычно null используется для присвоения переменной «пустого» или «неизвестного» значения, а undefined – для проверок, была ли переменная назначена.
Symbol
Тип символ используется для создания уникальных идентификаторов в объектах. По спецификации, в качестве ключей для свойств объекта могут использоваться только строки или символы.
«Символ» представляет собой уникальный идентификатор.
Создаются новые символы с помощью функции Symbol():
let id = Symbol();
При создании, символу можно дать описание (также называемое имя), в основном использующееся для отладки кода:
let id = Symbol(“id”);
Символы гарантированно уникальны. Даже если мы создадим множество символов с одинаковым описанием, это всё равно будут разные символы. Описание – это просто метка, которая ни на что не влияет.
Пример:
let id1 = Symbol(“id”);
let id2 = Symbol(“id”);
alert(id1 == id2); // false
Символы не преобразуются автоматически в строки. Это – языковая «защита» от путаницы, ведь строки и символы – принципиально разные типы данных и не должны неконтролируемо преобразовываться друг в друга.
BigInt
В JS тип number не может безопасно работать с числами, большими, чем (2 в 53 степени -1) (т. е. 9007199254740991) или меньшими, чем -(2 в 53 степени -1) для отрицательных чисел. Технически, тип number может хранить и гораздо большие значения (вплоть до 1.7976931348623157 * 10 в 308 степени), однако за пределами безопасного диапазона ±(2 в 53 степени -1) многие из чисел не могут быть представлены с помощью этого типа данных из-за ограничений, вызванных внутренним представлением чисел в двоичной форме. Например, нечётные числа, большие, чем (2 в 53 степени -1), невозможно хранить при помощи типа number, они с разной точностью будут автоматически округляться до чётных значений. В то же время некоторые чётные числа, большие, чем (2 в 53 степени -1), при помощи типа number хранить технически возможно (однако не стоит этого делать во избежание дальнейших ошибок).
Для большинства случаев достаточно безопасного диапазона чисел от -(2 в 53 степени -1) до (2 в 53 степени -1). Но иногда нам нужен диапазон действительно гигантских целых чисел без каких-либо ограничений или пропущенных значений внутри него. Например, в криптографии или при использовании метки времени («timestamp») с микросекундами.
Тип BigInt был добавлен в JS, чтобы дать возможность работать с целыми числами произвольной длины.
Чтобы создать значение типа BigInt, необходимо добавить n в конец числового литерала:
// символ “n” в конце означает, что это BigInt
const bigInt = 1234567890123456789012345678901234567890n;
Object
В объектах хранят коллекции данных или более сложные структуры.
Это коллекция key-value.
Коллекция не отсортирована (для структурированный коллекций данных лучше не использовать объект).
Все в JS это объекты.
Объекты сравниваются по ссылке, а значит два объекта одинаковой структуры имеют разные ссылки и и х сравнение приведет к false.
Свойства и методы в объекте могут быть добавлены динамически.
Объект может быть создан с помощью фигурных скобок {…} (литеральная нотация) с необязательным списком свойств. Свойство – это пара «ключ: значение», где ключ – это строка или символ, а значение может быть чем угодно.
Нет никаких ограничений к именам свойств.
Чтобы получить доступ к свойству, мы можем использовать:
Запись через точку: obj.property.
Квадратные скобки obj[“property”]. Квадратные скобки позволяют взять ключ из переменной, например, obj[varWithKey].
Дополнительные операторы:
Удаление свойства: delete obj.prop.
Проверка существования свойства: “key” in obj.
Перебор свойств объекта: цикл for in (let key in obj).
Строковое преобразование
Строковое преобразование происходит, когда требуется представление чего-либо в виде строки.
Также мы можем использовать функцию String(value), чтобы преобразовать значение к строке.
let value = true;
alert(typeof value); // boolean
value = String(value);
alert(typeof value); // string
Численное преобразование
Численное преобразование происходит в математических функциях и выражениях.
Например, когда операция деления / применяется не к числу:
alert( “6” / “2” ); // 3,
строки преобразуются в числа
Мы можем использовать функцию Number(value), чтобы явно преобразовать value к числу:
let num = Number(str);
Явное преобразование часто применяется, когда мы ожидаем получить число из строкового контекста, например из текстовых полей форм.
Если строка не может быть явно приведена к числу, то результатом преобразования будет NaN.
Например:
let age = Number(“Любая строка вместо числа”);
alert(age); // NaN
Значение Преобразуется в…
undefined … NaN
null … 0
true / false … 1 / 0
string … Пробельные символы (пробелы, знаки табуляции \t, знаки новой строки \n и т. п.) по краям обрезаются. Далее, если остаётся пустая строка, то получаем 0, иначе из непустой строки «считывается» число. При ошибке результат NaN.
null и undefined ведут себя по-разному. Так, null становится нулём, тогда как undefined приводится к NaN.
Логическое преобразование
Происходит в логических операциях, но также может быть выполнено явно с помощью функции Boolean(value).
Правило преобразования:
Значения, которые интуитивно «пустые», вроде 0, пустой строки, null, undefined и NaN, становятся false.
Все остальные значения становятся true.
В JS, если строка не пустая (даже если она “0”), то она всегда true.