1. Я хочу, чтобы этот код выходил из системы "hey amy", но он выходит из системы "hey arnold" — почему?

Отвечать:

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

2. Я хочу, чтобы этот код выводил числа 0, 1, 2, 3 в таком порядке, но он не делает того, что я ожидаю (это ошибка, с которой вы сталкиваетесь время от времени, и некоторые люди любят спрашивать об этом в интервью).

Отвечать:

Проблема в том, что к моменту запуска setTimeout() i уже равно 4, и у нас нет никакого способа сослаться на него.

Один быстрый способ исправить это — просто изменить var на let:

Что мы знаем о let? Он блочный. У нас есть фигурные скобки в цикле for. Если вы запустите его сейчас, к моменту запуска setTimeout() мы будем регистрировать от нуля до четырех. Мы не получаем 4, 4 раза. Мы получаем это, как это было объявлено каждый раз.

3. Я хочу, чтобы этот код выходил из системы "doggo", но он выходит из системы undefined!

Отвечать:

Предыдущий код возвращает undefined. Почему? Выглядит, по первому условию let мы определяем объект с 2-мя атрибутами (имя и функция sayName()). Затем во второй раз мы копируем атрибут sayName, который является функцией, в другую переменную. И далее, мы вызываем эту переменную вне ее контекста (в глобальном). Функция sayName() вернет window.name (глобальное, если среда Node). И typeof window.name === "undefined".

Измените способ вызова функции, как показано ниже:

4. Я хочу, чтобы моей собаке было bark(), но вместо этого я получаю сообщение об ошибке. Почему?

Отвечать:

Dog.bark не является законным способом добавления свойства для существующего конструктора. Собственно, Dog.bark — это новый конструктор, не связанный с конструктором Dog(name).
Если вы хотите, чтобы собака лаяла, вы можете изменить код следующим образом:

5. Почему этот код возвращает те результаты, которые он делает?

Отвечать:

В условии if мы использовали простой оператор равенства (например, ==) в противовес строгому сравнению (например, ===). С этим оператором необязательно сравнивать один и тот же тип. При сравнении массива с числом массив будет преобразован в число. Это часть Абстрактного алгоритма сравнения равенства.
isBig(1) ===› вещь == 1 //false
isBig([2]) ===› вещь == [2] == 2 //false
isBig ([3]) ===› вещь == [3] == 3 //правда

источник: https://performancejs.com/post/hde6d32/The-Best-Frontend-JavaScript-Interview-Questions-(Written-by-a-Frontend-Engineer