Javascript RU Flashcards

1
Q

В чем разница между использованием «var», «let» и «const»?

A

Разница в уровне охвата

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

Как показать пользователю уведомление о том, что в его браузере не включен javascript?

A

Your browser does not support JavaScript!

OBS!: eto v HTML

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

Почему важен порядок добавления скриптов на страницу?

A

Например, следующий фрагмент приведет к ошибке «Uncaught ReferenceError: jQuery is not defined»

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

Как проверить, что переменная не является неопределенной? Как проверить, что свойство существует в объекте?

A
if (typeof someVar !== "undefined") {
    // делаем что-то
}
// проверяем свойство с наследованием
if ('someProperty' in object) {
    // делаем что-то
}
// проверяем свойство без наследования
if (object.hasOwnProperty('someProperty')) {
    // делаем что-то
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Написать простую функцию, чтобы проверить, является ли число целым?

A
function verifyInt(num) {
  return num % 1 === 0;
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Как остановить функцию setInterval?

A
// повторяем с интервалом в 1 секунду
let intervalId = setInterval(() => console.log('tick'), 1000);
// остановимся через 10 секунд 
setTimeout(() => { clearInterval(intervalId); console.log('stop'); }, 10000);
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Список примитивных типов в JavaScript

A

Тип числа представляет как целые числа, так и числа с плавающей запятой.

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

Логический тип имеет только два значения: true и false.

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

Разница между Java и JavaScript

A

Язык программирования JavaScript разработан Netscape, Inc и не является частью платформы Java.

Приложения Java запускаются на виртуальной машине или в веб-браузере, а JavaScript – в веб-браузере и некоторых серверных средах.

Код Java компилируется, тогда как код JavaScript находится в тексте и на веб-странице.

JavaScript – это язык сценариев ООП, тогда как Java – язык программирования ООП.

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

Что такое функция имени (Именованная функция) в JavaScript и как ее определить?

A

Именованная функция объявляет имя, как только оно определено. Ее можно определить с помощью ключевого слова функции как:

function named(){
// write code here
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Перепишите пример, используя promise:

const printSec = (number, callback) => {
  setTimeout(() => {
      console.log(`${number} sec`)
      callback()
    },
    1000)
}
printSec(1, () => {
  printSec(2, () => {
    printSec(3, () => {})
  })
})
A

это достаточно современный подход написания асинхронного кода. Ранее использовался подход с использованием колбеков. При большой вложенности получался т.н. «ад обратных вызовов».

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

const printSec = (number) => {
  return new Promise((resolve, reject) => {
   setTimeout(() => {
        console.log(`${number} sec`)
        resolve()
      },
      1000)
  })
}

printSec(1)
.then(() => printSec(2))
.then(() => printSec(3))

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

Как работает прототип?

A

Прототипное наследование - Каждый объект в JS имеет базовый объект – прототип. Если свойство не находится в исходном объекте, то поиск продолжается в его “родительском” объекте.

Установить прототип объекта можно только во время создания объекта: если вы создаете новый объект с помощью новой Func(), свойство объекта [[Prototype]] будет установлено на объект, на который ссылается Func.prototype.

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

Цикл событий - Что произойдет со страничкой в результате выполнения этого кода?

function foo() {
    setTimeout(foo, 0);
}

foo();

A

Ответ: ничего особенного. Задачи будут добавляться в цикл событий, но они не вызовут ни переполнения стека, ни бесконечной очереди, которая затормозит весь сайт.

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

function foo() {
    return Promise.resolve(1).then(foo);
}

foo();

Выполнение данного кода вызовет затормаживание интерфейса, т.к. при выполнении одного микротаска в очередь добавляется новый микротаск, который сразу же должен выполниться, без передачи управления другому пункту цикла событий.

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

Какие типы данных представлены в javascript?

A

Чтобы узнать тип переменной JavaScript, мы можем использовать оператор typeof.

String – представляет собой серию символов и записывается в кавычках. Строку можно представить в одинарных или двойных кавычках.

Number – представляет собой число и может быть записано с десятичными знаками или без них.

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

Boolean – представляет собой логическую сущность и может иметь только два значения: истина или ложь. Логические значения обычно используются для условного тестирования.

Undefined – когда переменная объявлена, но не назначена, она имеет значение undefined, и ее тип также не определен.

Null – представляет несуществующее или недопустимое значение.

Symbol – это новый тип данных, представленный в версии JavaScript для ES6. Он используется для хранения анонимного и уникального значения.

Object – используется для хранения коллекции данных.Важно помнить, что любой тип данных, который не является примитивным типом данных, относится к типу объекта в javascript.

Array – это не отдельный тип данных, на самом деле это Object. typeof null равен “object” и это нужно учитывать в проверках.

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

Как найти сумму элементов массива, если вложенность массива неизвестна?

arraySum([[1, 2, [3, 4]], [9], [10, 12]])

A

// используя рекурсию

function arraySum(arr) {
    let sum = 0;
    arr.map((item) => {
        if (Array.isArray(item)) {
            sum += arraySum(item);
        } else {
            sum += item;
        }
    });
    return sum;
}

console.log(arraySum([[1, 2, [3, 4]], [9], [10, 12]]));

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

В чем причина помещения всего содержимого исходного файла JavaScript в книгу функций?

A

Причина помещения всего содержимого исходного файла JavaScript в книгу функций -
Этот метод создает замыкание вокруг всего содержимого файла, что создает частное пространство имен и тем самым помогает избежать потенциальных конфликтов имен между различными модулями и библиотеками JavaScript.

Еще одна особенность этого метода – легко создать псевдоним для глобальной переменной. Это часто используется в плагинах jQuery.

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

Перечислите специальные числовые значения

A

Infinity больше любого числа

-Infinity меньше любого числа

NaN представляет собой ошибку (не число)

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

Какое предназначение файла package-lock.json?

A

package-lock.json автоматически создается для любых операций, когда npm изменяет дерево node_modules или package.json. Он описывает точное дерево, которое было сгенерировано, так что последующие установки могут генерировать идентичные деревья, независимо от промежуточных обновлений зависимостей.

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

Что такое запросы между источниками и CDN?

A

Запросы между источниками и CDN -
Если мы сделаем выборку с произвольного веб-сайта, это, вероятно, не удастся. Основная концепция здесь – триплет домен/порт/протокол.

Запросы из разных источников, отправленные в другой домен (даже субдомен), протокол или порт требуют специальных заголовков с удаленной стороны. Эта политика называется «CORS»: совместное использование ресурсов между источниками.

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

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

В чем смысл оборачивания всего содержимого JavaScript-файла в функцию? IIFE

A

Этот шаблон называется IIFE - Immediately Invoked Function Expression (немедленно вызываемое функциональное выражение). Этот подход позволяет:

обеспечить коду собственный блок видимости, то-есть контекст выполнения

избежать загрязнения глобальной области видимости глобальными переменными

избежать неумышленного переопределения уже существующих переменных в глобальной области видимости

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

В чем смысл и польза указания use strict в начале JavaScript-файла?

A

Команда use strict включает так называемый строгий режим. В этом режиме предупреждения становятся ошибками, что помогает в написании более чистого и безопасного кода, менее уязвимого к ошибкам в продакшене.

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

Что такое NaN? Какого типа это значение? Как можно узнать, равно ли значение переменной NaN?

A

NaN расшифровывается как “Not A Number”, это “falsey” (ложное) значение.

Выражение typeof NaN возвращает тип Number.

Проверить значение переменной на соответствие NaN можно, воспользовавшись встроенным методом isNaN() или используя оператор тройного равенства ===.

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

Что такое замыкание в JavaScript? Приведите пример.

A

Замыкание в JavaScript - это комбинация функции и лексического окружения, в котором она была определена. Это позволяет ей обращаться к переменным и функциям этого лексического окружения в дальнейшем.

В следующем примере мы определяем функцию makeCounter(), которая фактически является фабричной функцией. При вызове она возвращает дочернюю функцию, которая имеет доступ к лексическому окружению внешней функции, то-есть функции makeCounter().

Таким образом, возвращаемая функция запоминает переменную counter и в последующем изменяет ее значение.

function makeCounter(initial = 0) {
  let counter = initial;
  return function() {
    return counter += 1;
  }
}

const counterA = makeCounter(0);

console. log(counterA()); // 1
console. log(counterA()); // 2

const counterB = makeCounter(100);

console. log(counterB()); // 101
console. log(counterB()); // 102

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

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

A

Можно использовать оператор остатка ….

Можно использовать Object.assign(newObj, oldObj).

Но эти подходы не позволяют выполнить глубокое клонирование. Поэтому, если нам нужно клонировать объект со вложенными объектами, мы можем использовать либо метод какой-либо библиотеки (привет, lodash), либо сделать это средствами встроенного объекта JSON.

JSON.parse(JSON.stringify(objectToClone))

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

Как можно добавить элемент в начало и в конец массива?

A

Чтобы добавить элемент в начало массива, можно использовать - Array.prototype.unshift()

Для добавления элемента в конец массива подойдет - Array.prototype.push()

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

В чем разница между undefined и is not defined?

A

undefined - это значение, присваемое объявленной, но не проинициализированной переменной.

Мы получаем undefined, обращаясь к существующей переменной. А в случае обращения к несуществующей (необъявленной) переменной, мы получим ошибку is not defined.

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

Как проверить, является ли объект массивом?

A

Для этого можно использовать встроенный метод Array.isArray().

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

Что такое hoisting (поднятие) в JavaScript?

A

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

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

По этой причине, например, мы можем использовать до объявления функцию, объявленную через Function Declaration, но не можем ту, которая объявлена через Function Expression.

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

Что такое this?

A

this указывает на объект области видимости во время выполнения. По умолчанию this указывает на глобальный объект. В браузере выражение this === window будет истинно.

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

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

A

Если отвечать кратко, в JavaScript все является объектами. Эти объекты связаны цепочками прототипов, по которым им передаются методы и свойства. При обращении к свойству или методу объекта сначала происходит поиск этого свойства у самого объекта. В случае неудачи поиск перенаправляется в его прототип, затем в прототип прототипа и так далее, пока искомое свойство не будет найдено, либо пока не закончится цепочка прототипов.

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

Объясните, почему запись function foo(){}() вызывает ошибку и не работает, как IIFE?

A

Здесь дело в том, что круглые скобки вызова функции добавлены сразу после Function Declaration. Однако, они могут следовать только за выражением (expression). Поэтому мы должны либо прибегнуть к варианту с Function Expression, либо обернуть Function Declaration в скобки, тем самым превратив его в выражение.

const foo = function(){}()

// либо
(function foo(){})()
// либо со стрелочной функцией
(() => {})()
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

В чем разница между null, undefined и undeclared?

A

null - это в прямом смысле “ничего”. Можно использовать это значение в качестве плейсхолдера.

undefined - это значение для случая “объявлено, но не инициализировано”.

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

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

В каких случаях используются анонимные функции?

A

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

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

Объясните разницу между const person = Person() и const person = new Person() при function Person(){}

A

Если функция Person() не возвращает явным образом создаваемый экземпляр, то вариант const person = Person() присвоит константе person значение undefined, поскольку именно таков результат void функции.

Если функция Person явным образом возвращает экземпляр, он станет значением константы person при const person = Person().

Однако, вариант с использование оператора new “выигрывает”, поскольку он устанавливает корректную связь объекта person с цепочкой прототипов Person, в то время как выражение const person = Person() просто присваивает константе результат вызова функции.

34
Q

В чем разница между Function.prototype.call и Function.prototype.apply?

A

Оба метода вызывают исходный метод с подмененным контекстом, но .call принимает параметры через запятую, а .apply - массивом.

35
Q

Как работает Function.prototype.bind?

A

Данный метод возвращает функцию, по отношению к которой он вызывается, но с подмененным контекстом.

36
Q

Что вы знаете об AJAX?

A

AJAX = Asynchronous Javascript And XML. Это подход к асинхронному (неблокирующему) обмену данными с сервером.

Изначально для решения подобной задачи использовался объект XMLHttpRequest , сейчас же более актуален дружелюбный к обещаниям (Promise) fetch API.

37
Q

В чем разница между атрибутами и свойствами?

A

Атрибут - это HTML-термин, в то время как свойство - термин из JavaScript. Иными словами, если речь идет о значении в HTML-разметке, мы говорим об атрибуте. Однако, если имеется в виду свойство объекта, к которому мы получили доступ средствами JavaScript - вернее называть это свойством.

38
Q

В чем разница между == и ===?

A

Оператор двойного равенства производит приведение типов, оператор строгого равенства - нет.

39
Q

Почему лучше оставлять глобальную область видимости “как есть” и не трогать ее?

A

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

40
Q

Что такое SPA и как сделать его SEO-friendly?

A

Single Page Application - это реализация приложения таким образом, чтобы при первой загрузке пользователь получал все ресурсы, необходимые для того, чтобы избавиться от загрузки страницы с нуля при совершении интерактивных действий с интерфейсом.

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

Для того, чтобы сделать SPA SEO-friendly, можно обратиться к таким решениям, как предварительный рендеринг или серверный рендеринг.

41
Q

Какие преимущества и недостатки у использования Promise API вместо обратных вызовов?

A

Обещания избавляют разработчиков от ада обратных вызовов, но это не единственное их достоинство.

Важно также отметить, что пользуясь обратными вызовами, мы зачастую были вынуждены “верить” стороннему коду. А вызовет ли он наш коллбэк? А вызовет ли он его корректное количество раз? А не вызовет ли он его слишком рано или слишком поздно?

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

Используя обещания, мы сами властны над нашим кодом. Мы сначала дожидаемся результата вызова сторонней функции, возвращающей обещание, а потом передаем управление необходимому блоку кода. Обещание может быть разрешено один раз и с тех пор оно неизменно, так что надежность нашего кода резко возрастает.

42
Q

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

A

При первой встрече с проблемой я, не спеша усложнять себе жизнь, обращаюсь к console.log. Если это не помогает, вызываю тяжелую артиллерию в виде браузерного отладчика.

43
Q

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

A

В случае с массивами, это чаще всего forEach и map. Реже возникает необходимость в for, for in, for of, reduce, filter и подобных.

А чтобы обойти объект, понадобится немного изобретательности. Один из вариантов - получить ключи с помощью Object.keys, по которым впоследствии пройти с помощью forEach. Либо же можно воспользоваться Object.values, Object.entries, Object.keys.

44
Q

Объясните разницу между изменяемыми и неизменяемыми значениями

A

Значения примитивных типов (например, строка или число) не могут быть изменены после того, как попали в память.

Значения объектных типов (объекты, массивы) могут изменяться в ходе работы программы.

45
Q

Объясните разницу между синхронными и асинхронными функциями

A

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

С другой стороны, есть асинхронный способ выполнения функций, когда мы не блокируем весь интерфейс благодаря тому, что не дожидаемся выполнения функции, а подписываемся на событие с передачей обратного вызова. Ну, или мы можем иметь дело с обещанием или с прочими внешними API вроде setTimeout.

В таком случае браузер помещает обработчик события в очередь задач, а когда наступает время его вызвать, он перемещает его в стек вызовов.

46
Q

Что такое цикл событий? В чем разница между стеком вызовов и очередью задач?

A

Стек вызовов - это структура данных (первым вошел, последним вышел), используемая для отслеживания порядка выполнения функций в текущем контексте (области видимости).

Очередь задач - это структура данных (первым вошел, первым вышел), используемая для отслеживания выполнения асинхронных функций, готовых оказаться в стеке вызовов.

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

47
Q

В чем разница между let, const и var?

A

var

поднимается в начало области видимости функции при компиляции

объявляет переменную, которая может быть перезаписана

объявляет переменную, которая может быть переопределена

let

поднимается в начало области видимости блока при компиляции

объявляет переменную, которая может быть перезаписана

объявляет переменную, которая не может быть переопределена

const

поднимается в начало области видимости блока при компиляции

объявляет переменную, которая не может быть перезаписана или переопределена

48
Q

В чем разница между ES6 class и ES5 function constructor?

A

Классы, добавленные в стандарте EcmaScript 6, всего лишь синтаксический сахар поверх всем известных прототипов.

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

49
Q

Что такое функция высшего порядка?

A

Функция, принимающая функцию обратного вызова в качестве аргумента.

50
Q

Что такое DOM?

A

DOM - Document Object Model (объектная модель документа). Другими словами, это дерево всех узлов страницы, которые распознал браузер в процессе обработки HTML-разметки.

DOM - это интерфейс, позволяющий JavaScript-коду взаимодействовать с шаблоном.

51
Q

В чем разница между областью видимости функции и блочной областью видимости?

A

Различие наблюдается при использовании ключевого слова var, которое ограничивается только областью видимости функции.

52
Q

Что произойдет в результате выражения var foo = 10 + “20” и почему?

A

Переменная foo примет значение “1020”.

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

53
Q

Как работает JavaScript?

A

Это общие вопросы интервью JS, задаваемые в интервью. Каждый браузер имеет три основных компонента для работы. Первый - интерпретатор DOM (объектная модель документа). Это займет ваш HTML-документ и конвертировать и отображать в браузере. Другая небольшая программа, которая является частью браузера, - это интерпретатор CSS, который будет стилизовать страницу и сделать ее лучше. Последняя из них - мини-программа в браузере, называемая движком JS.

Браузер загружает файл HTML / файл JS
JavaScript является интерпретируемым языком (означает, что компиляция не требуется)

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

54
Q

Как работает JavaScript?

A

Это общие вопросы интервью JS, задаваемые в интервью. Каждый браузер имеет три основных компонента для работы. Первый - интерпретатор DOM (объектная модель документа). Это займет ваш HTML-документ и конвертировать и отображать в браузере. Другая небольшая программа, которая является частью браузера, - это интерпретатор CSS, который будет стилизовать страницу и сделать ее лучше. Последняя из них - мини-программа в браузере, называемая движком JS.

55
Q

Упомянуть некоторые особенности JavaScript?

A

JS - легкий язык программирования с интерпретируемой функциональностью
JS с открытым исходным кодом и кроссплатформенный
JS интегрирован в HTML и Java
Предназначен для создания сетевых приложений

56
Q

Объясните делегирование событий

A

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

Преимущества этого приёма:

  • Экономит объем используемой памяти, т.к. для родительского элемента требуется только один обработчик.
  • Не нужно привязывать или убирать обработчики при добавлении и удалении элементов.

Ссылки

https: //davidwalsh.name/event-delegate
https: //stackoverflow.com/questions/1687296/what-is-dom-event-delegation

57
Q

Объясните, как this работает в JavaScript

A

Говоря максимально простым языком, значение this зависит от того, как вызывается функция.

  1. Если ключевое слово new используется при вызове функции, this внутри функции является совершенно новым объектом.
  2. Если для вызова/создания функции используются apply, call или bind, то this внутри функции - это объект, который передается в качестве аргумента.
  3. Если функция вызывается как метод, например, obj.method(), то this - это объект, к которому принадлежит функция.
  4. Если функция вызывается без контекста, то есть она вызывается без условий, описанных в пунктах выше, то this является глобальным объектом. В браузере это объект window. В строгом режиме (‘use strict’), this будет undefined вместо глобального объекта.
  5. Если применяются несколько из вышеперечисленных правил, то правило, которое выше выигрывает и устанавливает значение this.
  6. Если функция является стрелочной функцией, то она игнорирует все вышеописанные правила и получает значение this из лексического окружения во время ее создания.

Чтобы получить более подробное объяснение, ознакомьтесь с его статьей на Medium.

58
Q

описать основное различие между циклом .forEach и циклом .map()? И в каких случаях каждый из них используется?

A

Основное различие между .forEach и .map() состоит в том, что .map() возвращает новый массив. Если вам нужен результат, но вы не хотите изменять исходный массив, .map() - очевидный выбор. Если вам просто нужно перебрать массив, то стоит воспользоваться forEach.

59
Q

В каких случаях обычно используются анонимные функции?

A
  1. Они могут использоваться в IIFE для инкапсуляции кода в локальную область видимости, чтобы объявленные в ней переменные не попадали в глобальную область видимости.
(function () {
  // Здесь код функции.
})();
  1. Как callback-функция, которая используется один раз и не должна использоваться где-либо еще.

setTimeout(function () {
console.log(‘Hello world!’);
}, 1000);

  1. Аргументы в конструкциях функционального программирования.
const arr = [1, 2, 3];
const double = arr.map(function (el) {
  return el * 2;
});
console.log(double); // [2, 4, 6]
60
Q

Объясните, что такое всплытие событий (event bubbling)

A

Когда событие срабатывает на элементе DOM, оно попытается обработать событие (если привязан обработчик), затем событие всплывет вверх к своему родителю и это повторится снова. Подобное всплытие проходит по всем предкам элемента вплоть до document. Всплытие событий является механизмом, на котором основано делегирование событий.

61
Q

Сделайте так, чтобы этот код работал:

duplicate([1, 2, 3, 4, 5]); // [1,2,3,4,5,1,2,3,4,5]

A
function duplicate(arr) {
  return arr.concat(arr);
}

duplicate([1, 2, 3, 4, 5]); // [1,2,3,4,5,1,2,3,4,5]

62
Q

Почему тернарный оператор так называется?

A

“Тернарный” означает три. Троичное выражение принимает три операнда: условие, выражение “then” и выражение “else”.

63
Q

Что делает строчка “use strict”;? Какие достоинства и недостатки от ее использования?

A

‘use strict’ это директива, используемая для включения строгого режима во всем скрипте или отдельных функциях.

Преимущества:

  • Не позволяет случайно создавать глобальные переменные.
  • Любое присваивание, которое в обычном режиме завершается неудачей, в строгом режиме выдаст исключение.
  • При попытке удалить неудаляемые свойства, выдаст исключение (в то время как в нестрогом режиме никакого действия бы не произошло).
  • Требует, чтобы имена параметров функции были уникальными.
  • this в глобальной области видимости равно undefined.
  • Перехватывает распространенные ошибки, выдавая исключения.
  • Исключает неочевидные особенности языка.

Недостатки:

  • Нельзя использовать некоторые особенности языка, к которым привыкли некоторые разработчики.
  • Нет доступа к function.caller и function.arguments.
  • Объединение скриптов, написанных в строгом режиме может вызвать проблемы.
64
Q

Почему считается хорошим тоном оставить глобальную область видимости (global scope) в нетронутом состоянии?

A

Каждый скрипт имеет доступ к глобальной области видимости, и если каждый будет использовать глобальное пространство имен для определения своих переменных, то могут возникнуть конфликты. Используйте модульный паттерн (используя IIFE) для инкапсуляции ваших переменных в локальное пространство имен.

65
Q

Какие преимущества и недостатки при использовании промисов вместо колбэков (callbacks)?

A

Преимущества

  1. Помогает избежать “callback hell”, который может быть нечитаемым.
  2. Упрощает написание последовательного удобочитаемого асинхронного кода с помощью .then().
  3. Упрощает написание параллельного асинхронного кода с помощью Promise.all().
  4. С использованием промисов можно избежать следующих проблем, которые возникают при использовании callback-функций:
  • –Колбэк-функция была вызвана слишком рано
  • –Колбэк-функция была вызвана слишком поздно (или вовсе не была вызвана)
  • –Колбэк-функция была вызвана слишком мало или слишком много раз
  • –Не удалось передать необходимую среду/параметры
  • –Были пропущены ошибки/исключения

Недостатки

  1. Чуть более сложный код (спорно).
  2. В старых браузерах, где не поддерживается ES2015, вам нужно загрузить полифил, чтобы их использовать.
66
Q

Какие преимущества и недостатки при использовании промисов вместо колбэков (callbacks)?

A

Преимущества

  1. Помогает избежать “callback hell”, который может быть нечитаемым.
  2. Упрощает написание последовательного удобочитаемого асинхронного кода с помощью .then().
  3. Упрощает написание параллельного асинхронного кода с помощью Promise.all().
  4. С использованием промисов можно избежать следующих проблем, которые возникают при использовании callback-функций:
  • –Колбэк-функция была вызвана слишком рано
  • –Колбэк-функция была вызвана слишком поздно (или вовсе не была вызвана)
  • –Колбэк-функция была вызвана слишком мало или слишком много раз
  • –Не удалось передать необходимую среду/параметры
  • –Были пропущены ошибки/исключения

Недостатки

  1. Чуть более сложный код (спорно).
  2. В старых браузерах, где не поддерживается ES2015, вам нужно загрузить полифил, чтобы их использовать.

Ссылки
https://github.com/getify/You-Dont-Know-JS/blob/master/async%20%26%20performance/ch3.md

67
Q

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

A

React и Redux -

  • -React Devtools
  • -Redux Devtools

JavaScript -

  • -Chrome Devtools
  • -Выражение debugger
  • -Отладка при помощи старого доброго console.log
68
Q

Какие языковые конструкции вы используете для итерации по свойствам объекта и элементам массива?

A

Для объектов:

  1. for-in циклы - for (var property in obj) { console.log(property); }. Тем не менее, он также будет перебирать его унаследованные свойства, и вам нужно добавить проверку obj.hasOwnProperty(property) перед его использованием.
  2. Object.keys() - Object.keys(obj).forEach(function (property) { … }). Object.keys()- это статический метод, который возвращает все перечисляемые свойства объекта.
  3. Object.getOwnPropertyNames() - Object.getOwnPropertyNames(obj).forEach(function (property) { … }). Object.getOwnPropertyNames() - это статический метод, который возвращает все перечисляемые и неперечисляемые свойства объекта.

Для массивов:

  1. Циклы for - for (var i = 0; i < arr.length; i++). Распространенной ошибкой здесь является то, что var находится в области видимости функции, а не в блочной области видимости, и в большинстве случаев нам нужна переменная-итератор блочной области. ES2015 позволяет использовать let, который имеет блочную область видимости, и рекомендуется использовать его вместо var. В итоге: for (let i = 0; i < arr.length; i++).
  2. forEach - arr.forEach(function (el, index) { … }). Эта конструкция иногда может быть более удобной, потому что вам не нужно использовать index, если все, что вам нужно, это элементы массива. Существуют также методы every и some, которые позволят вам досрочно завершить итерацию.
  3. for-of циклы - for (let elem of arr) { … }. ES6 представил новый цикл for-of, который позволяет перебирать объекты, которые соответствуют итерируемому протоколу такие как String, Array, Map, Set, и т.д. Он сочетает в себе преимущества цикла for и метода forEach(). Преимущество цикла for заключается в том, что его можно преждевременно завершить, а преимущество forEach() заключается в том, что он более лаконичен, чем цикл for, поскольку вам не нужна переменная счетчика. С циклом for-of вы получаете возможность выхода из цикла и более сжатый синтаксис.
69
Q

Объясните разницу между синхронными и асинхронными функциями

A

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

Асинхронные функции обычно принимают callback-функцию в качестве параметра, и выполнение продолжается на следующей строке сразу после вызова асинхронной функции. Callback-функция вызывается только тогда, когда асинхронная операция завершена и стек вызовов пуст. Ресурсоемкие операции, такие как загрузка данных с веб-сервера или запросы к базе данных, должны выполняться асинхронно, чтобы основной поток мог продолжать выполнять другие операции вместо блокировки до завершения этой долгой операции

70
Q

Что такое цикл событий (event loop)? В чем разница между стеком вызовов (call stack) и очередью событий (task queue)?

A

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

71
Q

ООП: Объектно-ориентированное программирование — что это?

A

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

72
Q

ООП: четыре главные концепции

A

Абстракция, Инкапсуляция, Наследование, Полиморфизм

73
Q

ООП: Что такое Абстракция?

A

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

74
Q

ООП: Что такое Интерфейс?

A

интерфейс — публичная ( public ) часть объекта, доступная остальным объектам.

В объектных языках программирования, с помощью механизма интерфейсов, которые обычно объявляют через ключевое слово interface , можно явно описывать «контракты» взаимодействия объектов.

Например, вы создали интерфейс “ЛетающийТранспорт” с методом лететь (откуда, куда, пассажиры) , а затем описали методы класса Аэропорт так, чтобы они принимали любые объекты с этим интерфейсом. Теперь вы можете быть уверены, что любой объект, реализующий интерфейс — будь то Самолёт , Вертолёт или “ДрессированныйГрифон” — сможет работать с Аэропортом .

75
Q

ООП: Что такое Инкапсуляция?

A

Инкапсуляция — это способность объектов скрывать часть своего состояния и поведения от других объектов, предоставляя внешнему миру только определённый интерфейс взаимодействия с собой.

Например, вы можете инкапсулировать что-то внутри класса, сделав его приватным ( private ) и скрыв доступ к этому полю или методу для объектов других классов. Чуть более свободный, защищённый ( protected ) режим видимости
сделает это поле или метод доступным в подклассах.

76
Q

ООП: Что такое Наследование?

A

Наследование — это возможность создания новых классов на основе существующих. Главная польза от наследования — повторное использование существующего кода. Расплата за наследование проявляется в том, что подклассы всегда следуют интерфейсу родительского класса. Вы не можете
исключить из подкласса метод, объявленный в его родителе.

В большинстве объектных языков программирования класс может иметь только одного родителя. Но, с другой стороны, класс может реализовывать несколько интерфейсов
одновременно.

77
Q

ООП: Что такое Полиморфизм?

A

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

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

Полиморфизм — это способность программы выбирать различные реализации при вызове операций с одним и тем же названием.

Для лучшего понимания полиморфизм можно рассматривать как способность объектов «притворяться» чем-то другим. В приведённом выше примере собаки и коты притворялись
абстрактными животными.

78
Q

isFinite() ?

A

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

isFinite(Infinity); // false
isFinite(NaN); // false
isFinite(-Infinity); // false

isFinite(0); // true
isFinite(2e64); // true

isFinite(“0”); // true

79
Q

parseFloat() ?

A

Функция parseFloat() принимает строку в качестве аргумента и возвращает десятичное число (число с плавающей точкой)

Все примеры ниже вернут 3.14

parseFloat(3.14);
parseFloat('3.14');
parseFloat('314e-2');
parseFloat('0.0314E+2');
parseFloat('3.14какие-нибудь не цифровые знаки');
80
Q

parseInt() ?

A

Функция parseInt() принимает строку в качестве аргумента и возвращает целое число в соответствии с указанным основанием системы счисления.

Все следующие примеры возвращают 15:

parseInt(15.99, 10);
parseInt(“15*3”, 10);
parseInt(“15e2”, 10);
parseInt(“15px”, 10);

81
Q

Цикл for…in перебирает?

A

свои и унаследованные свойства объекта