(https://hh.ru/applicant/skills/674/verification_methods?rank=2&kind=theory)

  1. Как можно узнать, какой именно элемент был нажат в рамках делегирования события на родителе?
    -> с помощью event.target
    (другие варианты: Через window.event.srcElement; Только через выбор селектора вручную; по this внутри обработчика; через event.currentTarget;)

  2. Вам нужно реализовать систему локализации интерфейса. Для каждой строки интерфейса должно быть несколько переводов на разные языки. Необходимые функциональности:

  • Хранение переводов на русском, английском и других языках
  • Быстрое получение перевода по ключу и языку
  • Возможность обновлять и добавлять новые переводы
    -> Создать объект, где ключи - это языки, а значение - объект с ключами-строками и значениями-переводами
    (другие варианты: Использовать массив, где каждый элемент - это пара “ключ-строка, перевод”; Хранить всё в одной огромной JSON-строке и регулярно её парсить; Делать глобальную переменную для каждого языка и записывать переводы в виде: en_key: translation; Сформировать общий массив всех переводов и искать в нём по индексу;)
  1. Какую концепцию наследование в JavaScript демонстрирует код ниже?
function A() {}
A.prototype.shared = 'value'
function B() {}
B.prototype = Object.create(A.prototype)
B.prototype.unique = 'another'
const b = new B()

-> Цепочка прототипов вручную
(другие варианты: Поверхностное наследование; Инкапсуляция на уровне объекта; Наследование свойств; Формальное клонирование;)

  1. Как можно изменить прототип объекта в JavaScript?
    -> С помощью Object.setPrototypeOf(obj, prototype)
    (другие варианты: Прототип заменяется автоматически при вызове конструктора; только при помощи классов; Нужно вызвать prototype.override(); Прототип нельзя изменить после создания;)

  2. Что произойдет при выполнении кода?

function createCounter() {
  let count = 0;
  return {
    increment() {
      count++;
      return count;
    }
  };
}  
const counter = createCounter();
console.log(counter.increment());

-> Метод increment использует замыкание для доступа к count и увеличивает его;
(другие варианты: Каждый вызов increment возвращает 1, так как заново создается count и увеличивается на 1; Создается глобальная переменная count и метод increment в counter, который увеличивает count; Функция createCounter ничего не возвращает; count становится недоступным после первой итерации;)

  1. Почему нельзя использовать стрелочную функцию как конструктор (с оператором new)?
    -> Она не имеет `[[Construct]]` и не создаёт собственный объект this;
    (другие варианты: Она не поддерживает ключевое слово new; Она наследует прототип родителя; Она всегда возвращает undefined; Она не принимает аргументы;)

  2. Какое из следующих выражения даст значение false?
    -> 4 = '4'
    (другие варианты: ‘a’ < ‘z’; 5+2>3; true ! false; 10>2)

  3. Когда уместно использовать setTimeout?
    ->Когда необходимо искусственно сместить выполнение функции по времени в пределах основной очереди;
    (другие вопросы: Когда вызываемая функция формирует результат на основе внешнего флага; Когда требуется отреагировать на пользовательское события и сохранить данные; Когда логика построена вокруг итеративных преобразований массивов; Когда структура предполагает множественные циклы с предсказуемым временем выполнения;)

  4. Что выведет выражение?

let count = 5;
count = ++count + 6;
console.log(count)

->12

  1. Что произойдет с исходным объектом если его передать в функцию и изменить одно из его свойств внутри этой функции?
    ->Исходный объект тоже изменится, потому что объект передаётся по ссылке;

  2. В теле цикла for объявлена функция через let fn = () => …; Что будет с переменной fn после завершения цикла?
    ->Если функция объявлена внутри тела цикла через let, то переменная fn имеет блочную область видимости;

  3. Какое из выражений является неверным?

  • Cтроку можно изменять
  • Тип null является “object”
  • undefiend используется когда значение не задано
    ->Строку можно изменять

index javascript-easy-level