Вы уверены что знаете JavaScript? В таком случае предлагаю вам рассмотреть список моих собственных задач, которые я предлагаю на собеседованиях (на один из проектов крупного банка). Как показала статистика ни один кандидат не смог правильно ответить на все перечисленный вопросы, будь то Junior или Senior. Зато сразу видно кто из кандидатов умеет самостоятельно размышлять, а это довольно ценный навык. Итак, поехали!
1.1. Чему равно g после выполнения следующего кода?
f = g = 0;
(function () {
try {
f = function() {
return f();
};
f();
} catch (e) {
return g++ && f();
} finally {
return ++g;
}
function f() { g += 5; return 0; }
}) ();
1.2. Уже начинаете задумываться? Вот еще похожая задачка:
f = g = 0;
(function () {
try {
f = function() {
return f();
} && f();
} catch (e) {
return g++ && f();
} finally {
return ++g;
}
function f() { g += 5; return 0; }
}) ();
2.1. Эту задачу решить в уме практически невозможно. Вооружитесь бумажкой. Что выведет без 'use strict' и что с 'use strict'?
function b(b) {
return this.b && b(b)
}
b(b.bind(b))
2.2. Аналогичный вопрос на понимание отличий стрелочных функций.
c = (c) => {
return this.c && c(c)
}
c(c.bind(c))
3. Немного расслабимся. Самая простая задачка. Как бы не был банален следующий вопрос, однако не все кандидаты с опытом ответили на него правильно, что не перестает меня удивлять и по сей день. Это один из примеров, где знания, казалось бы, ненужного Assembler все-же выручают.
var g = 0;
g = 1 && g++;
console.log(g);
4. Этот вопрос тоже довольно прост. Какие варианты записи правильны и что вернет каждое выражение?
!function(){}()
function(){}()
true && function(){}()
(function(){})()
function(){}
!function(){}
5. Один раз я и сам не смог правильно объяснить что же происходит в этих, придуманных мною, казалось бы двух строчках. Зато каких! Как вы думаете, что вернет выражение?
var a = b = true, c = (a) => a;
(function a(a = c(b).a = c = () => a) { return a(); })()
6. Каков результат самовызывающейся функции?
var a = true;
(a = function () { return a })()
7. Ну и напоследок. Что выведет в консоль?
var v = 0;
try {
throw v = (function(c) { throw v = function(a){ return v; } })();
} catch (e) {
console.log (e()());
}
Вы думаете что ответили правильно на все вопросы? Советую убедиться в вашем браузере. Я думаю вы будете приятно удивлены! Если вам будет интересно, пишите в комментариях, и в следующем выпуске мы разберем указанные вами задачи. До встречи!
Автор: apborezkiy