(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: перевод; Построить единый массив всех переводов и искать по индексу;)
  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. Какое из утверждений неверно?

  • Строку можно изменить (мутировать)
  • Тип null — это “object”
  • undefined используется, когда значение не задано
    ->Строку можно изменить (мутировать)

index JavaScript-easy-level hh