- Я хочу, чтобы этот код выходил из системы
"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 //правда