11 вопросов
Хитрые вопросы про JavaScript
Проверьте себя в деле
1/11
Что выведет alert?
alert(str); // ?
let str = "Hello";
undefined
Нет, всё намного хуже.
Будет ошибка.
Конечно! То, что объявили через let, появляется только на этапе исполнения, а к моменту вывода до переменной дело ещё не дошло.
Hello
Думаете, компьютер вас поприветствует? Как бы не так!
2/11
Переменные apple и Apple (с большой буквы) – это одна и та же или разные?
Одна и та же.
Нет. Большое и маленькое яблоко — это два разных яблока :)
С большой буквы переменные называть нельзя.
На самом деле можно.
Слово apple является зарезервированным, нельзя использовать.
Признайтесь, вы патентный тролль?
Разные.
В JavaScript важна каждая буква.
3/11
Что выведет sayHi при вызове через setTimeout?
let name = "Вася";
function sayHi() { alert(name); }
setTimeout(function() {
let name = "Петя";
sayHi(); }, 1000);
undefined
Переменную name аж два раза объявили!
Вася.
В момент вызова функция SayHi() внутри себя не находит переменную name и вспоминает, что она была определена в глобальной области
Будет ошибка.
Зря вы так, ошибок тут нет.
Петя.
Казалось бы, но нет!
4/11
Что выведет это выражение?
let a = new Array(1,2), b = new Array(3);
alert(a[0] + b[0]);
4
Это было бы слишком просто, но нам нравится ход ваших мыслей.
NaN
Да. В переменной "а" у нас будет массив из двух чисел, а в переменной "b" — просто пустой массив из трёх элементов. Чувствуете нестыковку?
1
Нет, конечно, это же просто единица из первого массива
undefined
Хорошая попытка, но нет.
5/11
Какие конструкции для циклов есть в javascript?
Пять: for, for...in, for...of, while и do...while
Да! Оказывается, for...in и for...of — отдельные виды цикла. Про это даже в спецификации ECMA написано. Правда, их редко кто использует, но они есть.
Только две: for и while.
А как же очевидный do...while? Уже получается как минимум три!
Только одна: for.
А while уже за цикл не считается?
Три: for, while и do...while.
Самый очевидный ответ, но, к сожалению, тоже неверный!
6/11
Что выведет этот код?
for(let i=0; i<10; i++) {
setTimeout(function() {
alert(i);
}, 100); }
10 раз число 0.
Это какой-то хитрый ответ, но нет.
Ошибка: переменная не определена.
Определена командой let, ошибки тут нет.
Числа от 0 до 10.
Нет — при i=10 цикл остановится и вывода уже не будет.
Числа от 0 до 9.
Если при этом вы не запускали этот цикл в консоли и решили в уме — наше почтение!
10 раз число 10.
Сначала действительно может показаться, что функция опоздает с выполнением и получит 10 десяток, но это не так.
7/11
Сложный вопрос: чему равно 2 && 1 && null && 0 && undefined ?
undefined
Один из наших разработчиков тоже дал такой ответ и получил выговор от начальства.
0
Увы, ноль здесь совсем не главный.
1
Нам даже стало интересно, как вы пришли к этому ответу.
null
Бинго! Как только логическое И встречает null, всё остальное тут же превращается в тыкву.
2
Иногда двойка действительно победит, но не в этом случае.
false
Если бы всё было так просто, мы бы не спрашивали.
8/11
Что выведет этот код?
let a = (1,5 - 1) * 2;
alert(a);
0.999999999
Думаете, недостающую одну миллиардную компьютер забрал себе?
-0.5
Очень интересный ответ, но даже нам непонятно, как его получить.
8
Парадоксально, но это правильный ответ! Оператор запятая (есть и такой, без шуток) возвращает самый правый операнд: 1,5 → 5. А дальше: 5-1 = 4, а 4*2 = 8. Круто, правда?
1
Это хитрый тест, мы предупреждали :-)
0.5
Вполне пятничный ответ, но, к сожалению, неправильный.
9/11
Чему равна сумма [] + 1 + 2?
12
Верно. Чтобы хоть как-то провести сложение, JavaScript считает пустой массив пустой строкой. После этого всё остальное он тоже начинает воспринимать как строки.
1
А двойка? Двойка же ещё есть! Нельзя же так просто отказываться от слагаемых.
Здесь нет верного ответа
Мы не настолько коварны: правильный ответ всё же здесь есть.
NaN
Нет, ответ из трёх букв тут тоже не годится.
undefined
Не, JavaScript так просто не смутить!
10/11
Верно ли сравнение: "ёжик" > "яблоко"?
Да.
Правильно. При таком способе сравнения JavaScript берёт первые символы каждой строки и сравнивает их коды между собой. Получается U+0451 против U+044F, то есть код буквы «ё» больше, чем код буквы «я». Код решает!
Зависит от локальных настроек браузера.
Конкретно в этом примере от настроек браузера вообще мало что зависит :)
Нет.
А вот и да! Результат, конечно, будет так себе, но сравнивать можно.
11/11
Ну и классика: 1 == '1'?
Будет ошибка.
Где-то наверняка будет, но не здесь
False.
JavaScript приведёт всё к одному типу и вернёт True
True
Да. JavaScript приведёт всё к одному типу.
Результат
В этом раунде победил JavaScript
Это непростой язык, а вы держались достойно. Трай эген, и когда-нибудь ваш false превратится в true.
Результат
Нет ничего, чего бы вы не исправили дебагером
JavaScript всё ещё умеет вас удивить, но за пару попыток вы найдёте решение любой проблемы.
Результат
Boss of JavaScript
Это вы.