JS Basics - Data types & type conversion & operators Flashcards

1
Q

Типы данных

A

Всего 8 типов данных.
7 примитивных:
1. Number;
2. String;
3. Boolean;
4. Null;
5. Undefined;
6. Symbol;
7. BigInt.

Один не примитивный тип:
Object.

Все примитивы присваиваются по значению, все объекты присваивают по ссылке. Т.е. если мы присваиваем переменной значение объекта, то это значение не котируется, а отображается как ссылка на изначальный объект.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Number

A

Числовой тип данных (number) представляет как целочисленные значения, так и числа с плавающей точкой.

Кроме обычных чисел, существуют так называемые «специальные числовые значения», которые относятся к этому типу данных: Infinity, -Infinity и NaN.

Математические операции – безопасны
Математические операции в JavaScript «безопасны». Мы можем делать что угодно: делить на ноль, обращаться с нечисловыми строками как с числами и т.д.

Скрипт никогда не остановится с фатальной ошибкой (не «умрёт»). В худшем случае мы получим NaN как результат выполнения.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Infiniti

A

Специальное числовое значение, которое представляет собой математическую бесконечность ∞. Это особое значение, которое больше любого числа.

Мы можем получить его в результате деления на ноль:
alert( 1 / 0 ); // Infinity
Или задать его явно:
alert( Infinity ); // Infinity

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

NaN

A

Специальное числовое значение, которое означает вычислительную ошибку. Это результат неправильной или неопределённой математической операции, например:

alert( “не число” / 2 ); // NaN, такое деление является ошибкой.

Значение NaN «прилипчиво». Любая математическая операция с NaN возвращает NaN:
alert( NaN + 1 ); // NaN
alert( “не число” / 2 - 1 ); // NaN

Если где-то в математическом выражении есть NaN, то оно распространяется на весь результат (есть только одно исключение: NaN ** 0 равно 1).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

String

A

Строка должна быть заключена в кавычки.

В JS существует три типа кавычек.
Двойные кавычки: “Привет”.
Одинарные кавычки: ‘Привет’.
Обратные кавычки: Привет.
Двойные или одинарные кавычки являются «простыми», между ними нет разницы.

Обратные же кавычки имеют расширенную функциональность. Они позволяют нам встраивать выражения в строку, заключая их в ${…} (интерполяция). Мы можем положить туда всё, что угодно: переменную name, или выражение 1 + 2, или что-то более сложное.

Строка может содержать ноль символов (быть пустой), один символ или множество.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Boolean

A

Булевый тип (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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Boolean function

A

Boolean(value) - значение, отправленное в функцию будет преобразовано либо в true, либо в false, по правилам boolean type conversion.

Вместо конструктора boolean чаще используют двойное отрицание - !!. Первое отрицание работает как отрицание, а второе возвращает обратное значение.
Например let booleanLet = !!’false’ // true (т.к. строка).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Null

A

Специальное значение 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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Undefined

A

Специальное значение undefined также стоит особняком и формирует тип из самого себя. Undefined это и тип и значение.

Оно означает, что «значение не было присвоено».

Если переменная объявлена, но ей не присвоено никакого значения, то её значением будет undefined.

Технически мы можем присвоить значение undefined любой переменной, но так делать не рекомендуется. Обычно null используется для присвоения переменной «пустого» или «неизвестного» значения, а undefined – для проверок, была ли переменная назначена.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Symbol

A

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

«Символ» представляет собой уникальный идентификатор.

Создаются новые символы с помощью функции Symbol():
let id = Symbol();

При создании, символу можно дать описание (также называемое имя), в основном использующееся для отладки кода:
let id = Symbol(“id”);

Символы гарантированно уникальны. Даже если мы создадим множество символов с одинаковым описанием, это всё равно будут разные символы. Описание – это просто метка, которая ни на что не влияет.

Пример:
let id1 = Symbol(“id”);
let id2 = Symbol(“id”);
alert(id1 == id2); // false

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

BigInt

A

В 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;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Object

A

В объектах хранят коллекции данных или более сложные структуры.
Это коллекция key-value.
Коллекция не отсортирована (для структурированный коллекций данных лучше не использовать объект).

Все в JS это объекты.
Объекты сравниваются по ссылке, а значит два объекта одинаковой структуры имеют разные ссылки и и х сравнение приведет к false.
Свойства и методы в объекте могут быть добавлены динамически.

Объект может быть создан с помощью фигурных скобок {…} (литеральная нотация) с необязательным списком свойств. Свойство – это пара «ключ: значение», где ключ – это строка или символ, а значение может быть чем угодно.
Нет никаких ограничений к именам свойств.

Чтобы получить доступ к свойству, мы можем использовать:
Запись через точку: obj.property.
Квадратные скобки obj[“property”]. Квадратные скобки позволяют взять ключ из переменной, например, obj[varWithKey].

Дополнительные операторы:
Удаление свойства: delete obj.prop.
Проверка существования свойства: “key” in obj.
Перебор свойств объекта: цикл for in (let key in obj).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

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

A

Строковое преобразование происходит, когда требуется представление чего-либо в виде строки.

Также мы можем использовать функцию String(value), чтобы преобразовать значение к строке.

let value = true;
alert(typeof value); // boolean
value = String(value);
alert(typeof value); // string

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Численное преобразование

A

Численное преобразование происходит в математических функциях и выражениях.

Например, когда операция деления / применяется не к числу:

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Логическое преобразование

A

Происходит в логических операциях, но также может быть выполнено явно с помощью функции Boolean(value).

Правило преобразования:
Значения, которые интуитивно «пустые», вроде 0, пустой строки, null, undefined и NaN, становятся false.
Все остальные значения становятся true.

В JS, если строка не пустая (даже если она “0”), то она всегда true.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Преобразование объектов в примитивы

A

Результатом obj1 + obj2 (или другой математической операции) не может быть другой объект!

Не существует преобразования к логическому значению. В логическом контексте все объекты являются true.
Существует лишь их числовое и строковое преобразование.

Числовое преобразование происходит, когда мы вычитаем объекты или применяем математические функции. Например, объекты Date могут быть вычтены, и результатом date1 - date2 будет разница во времени между двумя датами.
Что касается преобразований к строке – оно обычно происходит, когда мы выводим на экран объект при помощи alert(obj) и в подобных контекстах.
Мы можем реализовать свои преобразования к строкам и числам, используя объектные методы.

Существует всего 3 типа преобразования типов (хинта) для этого:

  1. “string” (для alert и других операций, которым нужна строка)
  2. “number” (для математических операций)
  3. “default” (для некоторых других операторов, обычно объекты реализуют его как “number”)
    Спецификация явно описывает для каждого оператора, какой ему следует использовать хинт.

Алгоритм преобразования таков:
- Сначала вызывается метод objSymbol.toPrimitive, если он существует,
- В случае, если хинт равен “string”
происходит попытка вызвать obj.toString() и obj.valueOf(), смотря что есть.
- В случае, если хинт равен “number” или “default”
происходит попытка вызвать obj.valueOf() и obj.toString(), смотря что есть.

Все эти методы должны возвращать примитив (если определены).

17
Q

Оператор и операнд

A

Оператор - знак какого-то действия производимого над элементом/элементами.
Операнд - то, к чему применяется оператор.

18
Q

Базовые математические операторы

A

Сложение +,
Вычитание -,
Умножение *,
Деление /,
Взятие остатка от деления %,
Возведение в степень ** или ^.

19
Q

Унарный оператор

A

Оператор, который применяется к одному операнду. Например, оператор унарный минус “-“ меняет знак числа на противоположный.

20
Q

Бинарный оператор

A

Оператор, который применяется к двум операндам.

21
Q

Взятие остатка %

A

Результат a % b – это остаток от целочисленного деления a на b.

22
Q

Возведение в степень **

A

В выражении a ** b оператор возведения в степень умножает a на само себя b раз.

Математически, оператор работает и для нецелых чисел. Например, квадратный корень является возведением в степень 1/2:
alert( 4 ** (1/2) ); // 2

23
Q

Унарный и бинарный +

A

Если хотя бы один операнд является строкой, то второй будет также преобразован в строку.

Сложение и преобразование строк — это особенность бинарного плюса +. Другие арифметические операторы работают только с числами и всегда преобразуют операнды в числа.

Если операнд не число, то унарный плюс преобразует его в число. Это то же самое, что и Number(…), только короче.

24
Q

Приоритет операторов

A

Приоритет унарных операторов выше, чем соответствующих бинарных.

15 унарный плюс +
15 унарный минус -
14 возведение в степень **
13 умножение *
13 деление /
12 сложение +
12 вычитание -

2 присваивание =

25
Q

Присваивание

A

У присваивания один из самых низких приоритетов: 2.

Присваивание возвращает значения, за счет этого его можно использовать как часть более сложного выражения:
let a = 1;
let b = 2;
let c = 3 - (a = b + 1);
alert( a ); // 3
alert( c ); // 0

Но такие приемы делают код менее читабельным. Лучше не использовать.

Присваивание по цепочке:
a = b = c = 2 + 2;
Работает справа налево.

26
Q

Сокращённая арифметика с присваиванием

A

let n = 2;
n = n + 5;
n = n * 2;
Эту запись можно укоротить при помощи совмещённых операторов += и *=:

n += 5; // теперь n = 7 (работает как n = n + 5)
n *= 2; // теперь n = 14 (работает как n = n * 2)
alert( n ); // 14

Подобные краткие формы записи существуют для всех арифметических и побитовых операторов.

27
Q

Инкремент/декремент

A

Инкремент ++ увеличивает переменную на 1;
Декремент – уменьшает переменную на 1;

Важно:
Инкремент/декремент можно применить только к переменной. Попытка использовать его на значении, типа 5++, приведёт к ошибке.

Когда оператор идёт после переменной — это «постфиксная форма»: counter++.
«Префиксная форма» — это когда оператор идёт перед переменной: ++counter.

Если результат оператора не используется, а нужно только увеличить/уменьшить переменную, тогда без разницы, какую форму использовать (префиксную или постфиксную).

Если хочется тут же использовать результат, то нужна префиксная форма

Если нужно увеличить и при этом получить значение переменной до увеличения – нужна постфиксная форма.

28
Q

Побитовые операторы

A

Поддерживаются следующие побитовые операторы:
- AND(и) ( & )
- OR(или) ( | )
- XOR(побитовое исключающее или) ( ^ )
- NOT(не) ( ~ )
- LEFT SHIFT(левый сдвиг) ( &laquo_space;)
- RIGHT SHIFT(правый сдвиг) (&raquo_space; )
- ZERO-FILL RIGHT SHIFT(правый сдвиг с заполнением нулями) (&raquo_space;> )

29
Q

Оператор “,”

A

Оператор «запятая» предоставляет нам возможность вычислять несколько выражений, разделяя их запятой. Каждое выражение выполняется, но возвращается результат только последнего.

Оператор “,” имеет очень низкий приоритет, ниже =.

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

30
Q

Операторы сравнения

A

Больше/меньше: a > b, a < b.
Больше/меньше или равно: a >= b, a <= b.
Равно: a == b.
Для сравнения используется двойной знак равенства ==. Один знак равенства a = b означает присваивание.
Не равно в JS записывается как a != b.

Все операторы сравнения возвращают значение логического типа.

31
Q

Сравнение строк

A

Алгоритм сравнения двух строк довольно прост:

Сначала сравниваются первые символы строк.
Если первый символ первой строки больше (меньше), чем первый символ второй, то первая строка больше (меньше) второй. Сравнение завершено.
Если первые символы равны, то таким же образом сравниваются уже вторые символы строк.
Сравнение продолжается, пока не закончится одна из строк.
Если обе строки заканчиваются одновременно, то они равны. Иначе, большей считается более длинная строка.

32
Q

Сравнение разных типов

A

При сравнении значений разных типов JS приводит каждое из них к числу.

Возможна следующая ситуация:
Два значения равны.
Одно из них true как логическое значение, другое – false.
Например:
let a = 0;
alert( Boolean(a) ); // false
let b = “0”;
alert( Boolean(b) ); // true
alert(a == b); // true!

33
Q

Строгое сравнение

A

Использование обычного сравнения == может вызывать проблемы. Например, оно не отличает 0 от false.

Оператор строгого равенства === проверяет равенство без приведения типов.

Оператор строгого равенства делает код более очевидным и оставляет меньше места для ошибок.

34
Q

Сравнение с null и undefined

A

При строгом равенстве === значения null и undefined различны, так как различны их типы.

При нестрогом равенстве ==
Эти значения равны друг другу и не равны никаким другим значениям. Это специальное правило языка.

alert( null > 0 ); // (1) false
alert( null == 0 ); // (2) false
alert( null >= 0 ); // (3) true

Очень осторожно нужно относиться к любому сравнению с undefined/null, кроме случаев строгого равенства ===.

Не использовать сравнения >= > < <= с переменными, которые могут принимать значения null/undefined, разве что мы полностью уверены в том, что делаем. Если переменная может принимать эти значения, то нужно добавить для них отдельные проверки.

35
Q

Несравненное значение undefined

A

Значение undefined несравнимо с другими значениями:

alert( undefined > 0 ); // false (1)
alert( undefined < 0 ); // false (2)
alert( undefined == 0 ); // false (3)

Сравнения (1) и (2) возвращают false, потому что undefined преобразуется в NaN, а NaN – это специальное числовое значение, которое возвращает false при любых сравнениях.
Нестрогое равенство (3) возвращает false, потому что undefined равно только null, undefined и ничему больше.

36
Q

Spread operator (…)

A

Spread-оператор размещается справа от знака равно, там где массив формируется, при этом может появляться в любой части массива и дополнять его.

const frenchCities = [‘paris’, ‘marseille’];
const cities = [‘milan’, ‘rome’, …frenchCities];
// [‘milan’, ‘rome’, ‘paris’, ‘marseille’]

Spread-оператор нередко используется для копирования массива. Копирование предотвращает изменение исходного массива в том случае, когда необходимо менять его копию:

const frenchCities = [‘paris’, ‘marseille’];
const copy = […frenchCities];
copy.push(‘lyon’);
console.log(copy); // => [ ‘paris’, ‘marseille’, ‘lyon’ ]
console.log(frenchCities); // => [ ‘paris’, ‘marseille’ ]

37
Q

.__proto__

A

Есть у абсолютно всех объектов, созданных в JS. И у примитивов (т.к. за скобками они созданы через конструкторы тоже).
__proto__ ссылается на prototype той функции или класса, через который он создан.
Например
let age = 18;
age.__proto__ === Number.prototype

function Any() {… }
Any.__proto__ === Function.prototype

38
Q

.prototype

A

Есть только у функций (кроме стрелочных) и у классов. То есть у того, с помощью чего создаются объекты в JS.
На него ссылаются __proto__ объектов, которые создаются с помощью той или иной функции/класса.