Хитрые вопросы про JavaScript

У нас уже был тест про JavaSctipt, но с тех пор у нас вышло много проектов, а у вас появилось больше знаний. Но сегодняшний тест — особенный, потому что в нём много хитрых и каверзных вопросов. Если справитесь со всеми — можете смело проходить собеседование в любую компанию на позицию джуниор-программиста на JavaScript.

Хитрые вопросы про JavaScript
11 вопросов

Хитрые вопросы про JavaScript

Проверьте себя в деле

1/11

Что выведет alert?


alert(str); // ?
let str = "Hello";

Hello
Думаете, компьютер вас поприветствует? Как бы не так!
Будет ошибка.
Конечно! То, что объявили через let, появляется только на этапе исполнения, а к моменту вывода до переменной дело ещё не дошло.
undefined
Нет, всё намного хуже.
2/11

Переменные apple и Apple (с большой буквы) – это одна и та же или разные?

Одна и та же.
Нет. Большое и маленькое яблоко — это два разных яблока :)
Слово apple является зарезервированным, нельзя использовать.
Признайтесь, вы патентный тролль?
С большой буквы переменные называть нельзя.
На самом деле можно.
Разные.
В JavaScript важна каждая буква.
3/11

Что выведет sayHi при вызове через setTimeout?


let name = "Вася";
function sayHi() { alert(name); }
setTimeout(function() {
 let name = "Петя";
 sayHi(); }, 1000);

Будет ошибка.
Зря вы так, ошибок тут нет.
Вася.
В момент вызова функция SayHi() внутри себя не находит переменную name и вспоминает, что она была определена в глобальной области
undefined
Переменную name аж два раза объявили!
Петя.
Казалось бы, но нет!
4/11

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


let a = new Array(1,2), b = new Array(3);
alert(a[0] + b[0]);

1
Нет, конечно, это же просто единица из первого массива
4
Это было бы слишком просто, но нам нравится ход ваших мыслей.
NaN
Да. В переменной "а" у нас будет массив из двух чисел, а в переменной "b" — просто пустой массив из трёх элементов. Чувствуете нестыковку?
undefined
Хорошая попытка, но нет.
5/11

Какие конструкции для циклов есть в javascript?

Три: for, while и do...while.
Самый очевидный ответ, но, к сожалению, тоже неверный!
Только две: for и while.
А как же очевидный do...while? Уже получается как минимум три!
Только одна: for.
А while уже за цикл не считается?
Пять: for, for...in, for...of, while и do...while
Да! Оказывается, for...in и for...of — отдельные виды цикла. Про это даже в спецификации ECMA написано. Правда, их редко кто использует, но они есть.
6/11

Что выведет этот код?


for(let i=0; i<10; i++) {
 setTimeout(function() {
  alert(i);
 }, 100); }

10 раз число 0.
Это какой-то хитрый ответ, но нет.
Числа от 0 до 10.
  Нет — при i=10 цикл остановится и вывода уже не будет.
Ошибка: переменная не определена.
Определена командой let, ошибки тут нет.
10 раз число 10.
Сначала действительно может показаться, что функция опоздает с выполнением и получит 10 десяток, но это не так.
Числа от 0 до 9.
Если при этом вы не запускали этот цикл в консоли и решили в уме — наше почтение!
7/11

Сложный вопрос: чему равно 2 && 1 && null && 0 && undefined ?

false
Если бы всё было так просто, мы бы не спрашивали.
0
Увы, ноль здесь совсем не главный.
1
Нам даже стало интересно, как вы пришли к этому ответу.
2
Иногда двойка действительно победит, но не в этом случае.
null
Бинго! Как только логическое И встречает null, всё остальное тут же превращается в тыкву.
undefined
Один из наших разработчиков тоже дал такой ответ и получил выговор от начальства.
8/11

Что выведет этот код?


let a = (1,5 - 1) * 2;
alert(a);

-0.5
Очень интересный ответ, но даже нам непонятно, как его получить.
0.5
Вполне пятничный ответ, но, к сожалению, неправильный.
8
Парадоксально, но это правильный ответ! Оператор запятая (есть и такой, без шуток) возвращает самый правый операнд: 1,5 → 5. А дальше: 5-1 = 4, а 4*2 = 8. Круто, правда?
0.999999999
Думаете, недостающую одну миллиардную компьютер забрал себе?
1
Это хитрый тест, мы предупреждали :-)
9/11

Чему равна сумма [] + 1 + 2?

NaN
Нет, ответ из трёх букв тут тоже не годится. 
12
Верно. Чтобы хоть как-то провести сложение, JavaScript считает пустой массив пустой строкой. После этого всё остальное он тоже начинает воспринимать как строки.
Здесь нет верного ответа
Мы не настолько коварны: правильный ответ всё же здесь есть.
1
А двойка? Двойка же ещё есть! Нельзя же так просто отказываться от слагаемых.
undefined
Не, JavaScript так просто не смутить!
10/11

Верно ли сравнение: "ёжик" > "яблоко"?

Нет.
А вот и да! Результат, конечно, будет так себе, но сравнивать можно.
Да.
Правильно. При таком способе сравнения JavaScript берёт первые символы каждой строки и сравнивает их коды между собой. Получается U+0451 против U+044F, то есть код буквы «ё» больше, чем код буквы «я». Код решает!
Зависит от локальных настроек браузера.
Конкретно в этом примере от настроек браузера вообще мало что зависит :)
11/11

Ну и классика: 1 == '1'?

Будет ошибка.
Где-то наверняка будет, но не здесь
True
Да. JavaScript приведёт всё к одному типу.
False.
JavaScript приведёт всё к одному типу и вернёт True
Результат

В этом раунде победил JavaScript

Это непростой язык, а вы держались достойно. Трай эген, и когда-нибудь ваш false превратится в true. 

Результат

Нет ничего, чего бы вы не исправили дебагером

JavaScript всё ещё умеет вас удивить, но за пару попыток вы найдёте решение любой проблемы. 
Результат

Boss of JavaScript

Это вы.

Редактор:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Алина Грызлова

Через год — лучше работа, выше зарплата
В «Яндекс Практикуме» становятся разработчиками с нуля. Выберите язык — веб, Python, Java, C++ — и учитесь. Джуны зарабатывают от 80 000 ₽, мидлы — от 150 000 ₽. Дальше — программы трудоустройства и компенсация, если пойдёте в Яндекс.
Через год — лучше работа, выше зарплата Через год — лучше работа, выше зарплата Через год — лучше работа, выше зарплата Через год — лучше работа, выше зарплата
Вам может быть интересно
easy