JS Basics Flashcards

Brush up your knowledge of the basic concepts

1
Q

Какие типы данных есть в JavaScript?

A

Number
BigInt
String
Boolean

Null
Undefined

Object
Symbol

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

Как в JavaScript хранятся числа? Какие ошибки могут возникать при их использовании?

A

Числа хранятся в 64 битном формате, с плавающей точкой двойной точности.

Ошибки могут возникать при записи дробей. Так как не все дроби удобно представимы в двоичной системе, у них может возникать мантисса (её можно отбрасывать при помощи округления).

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

Чем отличается null от undefined?

A

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

Null - это ключевое слово, которым пользователь создаёт заглушку, чтобы показать отсутствие требуемого результата выполнения части программы.

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

Чем отличаются function declaration и function expression?

A

Function declaration всегда создаёт именованную функцию. Такая функция всплывает - она может быть использована до объявления.

Function expression создаёт анонимную функцию, которая может быть немедленно присвоена в переменную, вызвана или передана в другую функцию. Эти функции создаются только когда исполнение кода доходит до них.

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

Чему равен this у функции?

A

Если функция вызывается из объекта, то this ссылается на этот объект.

Если функция не принадлежит объекту, то this будет undefined в строгом режиме или будет ссылаться на глобальный объект (window в браузере) в обычном режиме.

Также this может быть потерян если мы передадим метод объекта в другую функцию вне объекта. Также this может быть явно указан в методах call и apply.

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

К какому типу данных относится NaN? Infinite? Где они определены?

A

Оба - числовой тип. NaN показывает число, которое нельзя представить в виде числа. Infinite нужен для представления результатов вычислений результатом которых является бесконесность.

И NaN, и Infinity - это неперезаписываемые переменные глобального контекста.

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

Что выведет typeof null?

A

Object

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

Что выведет typeof []? Почему?

A

Object

Массив - это объект со специальными свойствами (length, Symbol.Iterator) и прототипом Array в котором есть специальные методы массивов.

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

В каких случаях происходит неявное преобразование к числу?

A
  1. Операторы сравнения (>, =, <=);
  2. Побитовые операторы (|, &, ^, ~);
  3. Унарный +;
  4. Арифметических операции (+, -, *, /), кроме “+” где хоть один операнд - строка.
  5. Нестрогое равенство “==” (кроме случаев, когда оба операнда - строки, когда один из операндов null или undefined);
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Как строка преобразуется к числу?

A
  1. Убираются пробелы, переносы строки и табы
  2. Если результат - пустая строка -> 0
  3. Если результат непустой, то результат будет или число, или NaN если число нельзя считать
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Как Null, Undefined и Symbol преобразуются к числу?

A

null -> 0
undefined -> NaN
Symbol -> TypeError

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

Чему равен (==) NaN?

A

Ничему, даже самому себе

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

Чему равен (==) undefined?

A

undefined, null

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

Чему равен (==) null?

A

null, undefined

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

В каких случаях происходит неявное преобразование к строке?

A
  1. Бинарный “+”, когда один из операндов - строка
  2. В случаях, когда по контексту нужно преобразование к строке: console.log(), alert(), и тд. ( неявный вызов toString() )
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Как символьный тип приводится к строке?

A

Приводится только явно:
String(Symbol(‘my symbol’)) // ‘Symbol(my symbol)’

Неявное приведение вызывает ошибку:
‘ ‘ + Symbol(‘my symbol’) // TypeError is thrown

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

В каких случаях происходит неявное преобразование к булевому типу данных?

A
  1. Логический контекст (в условии оператора if).

2. С логическими операторами (||, &&, !)

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

Какие значения в JS приводятся к false? (falsy values)

A
  1. Boolean(‘’) // false
  2. Boolean(0) // false
  3. Boolean(-0) // false
  4. Boolean(NaN) // false
  5. Boolean(null) // false
  6. Boolean(undefined) // false
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Как объекты приводятся к примитивам?

A

Приведение к Boolean - всегда true.

Для определения, к какому типу нужно приводить объект, javascript использует хинты ‘string’, ‘number’ и ‘default’.

Сначала вызывается objSymbol.toPrimitive, если он не существует и хинт - строка, то вызывается сначала obj.toString() а затем, если вызов ничего не вернул, вызывается obj.valueOf(). Если хинт - число или дефолтный, интерпретатор пытается вызвать эти методы в обратном порядке.

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

Как можно осуществить проверку на undefined?

A

if( x === undefined) {}

if( typeof x === ‘undefined’ ) {}
Последний метод не выбрасывает исключение если переменная х не была объявлена. Но на практике это используется редко.

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

Какие особенности у ключевого слова var?

A
  1. Область видимости var ограничена только функциями и модулями (не имеют блочной области видимости).
  2. Переменные var инициализируются сразу при начале выполнения функции/скрипта (всплытие).
  3. Переменную с var можно объявить несколько раз.
22
Q

Почему лучше никогда не использовать конструкторы Number, String, Boolean с оператором new?

A

Потому что в таком случае будет создан не примитив, а объект. Это ведёт к непредсказуемому и плохо читаемому коду. Пример:

a = new Number(0)
if (a) {console.log("error!") // выведет error! потому что a - это объект
23
Q

Является ли такая запись перевода числа 123456 в двоичную систему корректной?

123456..toString(2)

A

Да, является. Первая точка после числа показывает интерпретатору, что это конец целой части, а вторая точка нужна уже для вызова метода.

24
Q

Какое максимальное число может хранить JS? Что он вернёт если мы попытаемся записать число больше этого предела (например, 2е500)?

A

2^52 – 64 бит: 52 бит для цифр, 11 бит для положения точки и 1 бит для знака.

Вернёт infinity.

25
Q

Как кодируются строки? Что такое суррогатные пары и как реализуются диакритические знаки?

A

Используется кодировка UTF-16 – символы кодируются 16-битными словами. Этого хватает для большинства символов, остальные же (например, эмоджи) кодируются двумя словами - такие символы называют суррогатными парами.

Диакритические знаки можно реализовать если добавить коды символов (верхняя точка, нижний апостроф, …) после самого символа.

26
Q

Как происходит сравнение строк (операторы >, =, <=) в JS?

A

Сравнение проводится в лексикографическом порядке, то есть, посимвольно. Значение каждого символа определяется его номером в таблице юникод. Например, z > Z даст true потому что 122 > 90.

27
Q

Как в js реализованы массивы?

A

Массивы - это объекты с числовыми индексами, специальными методами и свойством length.

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

28
Q

В чём главная проблема использования for..in при обходе массивов?

A

Этот способ в 10-100 раз медленнее чем for..of, потому что заточен для обхода любых объектов.

29
Q

Если у массива попытаться перезаписать свойство lenght, к чему это приведёт?

A

Если новое значение больше старого, ничего не изменится. Если новое значение будет меньше старого, то число элементов в массиве уменьшится.

30
Q

Как массив приводится к примитивным типам?

A

Так как это объект, то boolean – всегда будет true.

Так как у массивов нет Symbol.toPrimitive и valueOf, то они всегда будут приводиться к строке.

Результат приведения - элементы, разделённые запятой.

31
Q

Что возвращает метод splice у массивов?

A

Он возвращает удалённые элнменты

32
Q

Может ли метод splice вставить новые элементы в массив?

A

Да, splice вставит все аргументы, начиная с третьего

33
Q

Чем slice отличается от splice в массивах?

A
  1. Slice - возвращает копию, splice - проводит манипуляции в самом массиве.
  2. Разные аргументы:
    slice([start], [end]),
    splice(start[, deleteCount, arg1, …, argN])
34
Q

Какие вы знаете методы удаления/вставки/объединения массивов?

A

slice ([start], [end])
splice (start[, deleteCount, arg1, …, argN])
concat (arg1, …, argN)
[…arr1, …arr2, etc.]

35
Q

Какие вы знаете методы поиска в массивах?

A

Методы со строгим сравнением “===”

indexOf(item, from)
lastIndexOf(item, from)
includes(item, from)

Методы со своей функцией сравнения

find( function(item, index, array) {…} ) // вернёт элемент или undefined
findIndex // вернёт индекс или -1
filter( function( item, index, array) {…} ) // вернёт массив элементов

36
Q

Какие вы знаете методы преобразования массивов?

A
С заменой текущего массива:
*sort ( function compare(a, b) {
     if (a > b) return >0; 
     if (a == b) return 0; 
     if (a < b) return <0;
  } ) // без колбэка - преобразует к строкам и сравнит 
          их через ===
*reverse()
*join(glue) / split(delimiter)

С копированием в новый массив

  • filter( function( item, index, array) {…} )
  • map( function( item, index, array) {…} )
  • reduce( function( acc, item, index, array) {…} )
37
Q

Какие вы знаете методы для преобразования массивов?

A
С заменой текущего массива:
*sort ( function compare(a, b) {
     if (a > b) return >0; 
     if (a == b) return 0; 
     if (a < b) return <0;
  } ) // без колбэка - преобразует к строкам и сравнит 
          их через ===
*reverse()
*join(glue) / split(delimiter)

С копированием в новый массив

  • filter( function( item, index, array) {…} )
  • map( function( item, index, array) {…} )
  • reduce( function( acc, item, index, array) {…} )
38
Q

Чем Map принципиально отличается от объекта?

A

В map ключи могут быть любого типа.

map.length имеет сложность О(1), у объекта она O(n)

39
Q

Какие методы и свойства есть у map?

A
set(key, elem)
get(key)
has(key)
delete(key)
clear()
size
40
Q

Как можно перебрать map?

A
  1. методы
    map. keys() // итерируемый объект ключей
    map. values() // итерируемый объект значений
    map. entries() // итерируемый объект пар [key, value]
  2. цикл for..of
    использует map.entries()
  3. forEach ( (value, key, map) => … )
41
Q

Чем Set принципиально отличается от объекта?

A

Set - это множество значений без ключей. Значения не повторяются.

42
Q

Какие основные методы у Set?

A
add(value)
delete(value)
has(value)
clear()
size
43
Q

В каком порядке происходит перебор map и set?

A

В порядке добавления

44
Q

При обходе объекта в цикле, в каком порядке мы получим записи из него?

A

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

45
Q

При обходе объекта в цикле, в каком порядке мы получим записи из него?

A

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

Целочисленное свойство - это свойство, ключ которого не изменится при преобразовании сначала к целому числу, а затем обратно в строку.

46
Q

Как можно копировать объект?

A

Целиком - методы других библиотек вроде _.cloneDeep() или через рекурсивный обход циклом.

Object.assign( {}, obj ) и оператор расширения - поверхностная копия.

47
Q

Какой принцип лежит в основе управления памятью в Javascript?

A

Принцип достижимости. Упрощённо, «достижимые» значения – это те, которые доступны или используются. Они гарантированно находятся в памяти.

Любое значение считается достижимым, если оно доступно по ссылке или цепочке ссылок из любого объекта, находящегося в памяти.

48
Q

Какие можно привести примеры объектов гарантированно находящихся в памяти Javascript?

A
  • Локальные переменные и параметры текущей функции.
  • Переменные и параметры других функций в текущей цепочке вложенных вызовов.
  • Глобальные переменные.
  • (некоторые внутренние значения)
49
Q

Какой основной алгоритм сборки мусора?

A

Алгоритм пометок (“Mark-and-sweep”)

50
Q

Что такое this?

A

Это ссылка на контекст исполнения функции.

При обычном вызове, this === undefined в строгом режиме или globalObject в обычном.

При вызове функции как метода объекта - через точку - контекстом всегда будет объект до точки.

51
Q

Что будет, если в функции конструкторе явно вернуть что-то через return?

function Foo() {
   this.a = 5;
   return ... ;
}

const b = new Foo(); // что тут будет?

A

Если возвращаем примитив, то он будет проигнорирован и b = { a: 5 }

Если вернуть объект, то в b будет записан именно этот объект.

52
Q

Можно ли с помощью Object.keys/values/entries или цикла for получить символьные свойства?

A

Нет, к ним можно только обратиться напрямую.

Заметка: Object.assign() копирует все поля, в том числе и символьные.