Как стать автором
Обновить

Вопросы на собеседовании по javascript

Время на прочтение3 мин
Количество просмотров10K
Предлагаю такую подборку вопросов, которую можно задать кандидату. Ответы выводятся во всплывающем окне.
Испытуемому предлагается предугадать, что появится в окне alert.
Главное здесь — нужно объяснить, почему был получен такой ответ.
Не страшно, если ответ отличается от действительного, потому что в вопросах есть подковырки. Тогда нужно будет объяснить, как получился такой результат.
Скопируйте код в консоль браузера или вставьте его на html страницу. После каждого alert'а спрашивайте у собеседуемого, что будет на следующем, и почему.

Итак, начнем:
alert("Start");

// ***************************************************************************************

alert("Test 1.1: " + typeof Array);
alert("Test 1.2: " + typeof Array.prototype);
alert("Test 1.3: " + typeof Array.prototype["push"]);

// ***************************************************************************************

var n = "";
if (n)
{
    alert("Test 2.1: " + 'true');
}
else
{
    alert("Test 2.1: " + 'false');
}
alert("Test 2.2: " + (null == undefined));
alert("Test 2.3: " + (n == !!n));

// ******************************************************************************

alert("Test 3: " + ({}.a != {}.b));

// ****************************************************************************************

function C()
{
}
C.a = 2;

var g = new C();
alert("Test 4: " + g.a);

// ****************************************************************************

var s = {a: 0};
s.prototype = {b: 1};
alert("Test 5: " + (s.a == s.b));

// *******************************************************************************

function A()
{
    this.a = 4;
}

A.prototype = {a: 2};

var x = new A({a: 7});

alert("Test 6.1: " + A.a);
alert("Test 6.2: " + x.a);

// ***********************************************************************************

var a;
function func(arg)
{
    if (arg < 0)
    {
        return 1;
    }
    else if (arg > 0)
    {
        return 2;
    }
    else if (arg == 0)
    {
        return 3;
    }
}
var b =  func(a);
alert("Test 7: " + b);

// *********************************************************************************

try
{
    var tst = 5 / 0;
    if (tst > NAN)
    {
        throw new Error('bigger');
    }
    else if (isFinite(tst))
    {
        throw 'lower';
    }
    throw 0;
}
catch (e)
{
    alert("Test 8: " + (e.toString()));
}

// ******************************************************************************
var x = undefined;
alert("Test 9.1: " + (this['x'] === x));
alert("Test 9.2: " + (this['x'] === undefined));
alert("Test 9.3: " + this.hasOwnProperty('undefined'));

// ******************************************************************************

function B(arg)
{
    this.a = arg;
}

B.prototype = {a: 1};
B.a = 4;

var m = new B(3);
var j = new B();

alert("Test 10: " + m.a + j.a);

// ******************************************************************************


Update:
Ответы на вопросы + комментарии:
Посмотреть
Test 1.1: function
Array это функция, как и все классы в javascript.
Test 1.2: object
prototype функции — это Object
Test 1.3: function
push — это метод Array, определенный в prototype

Test 2.1: false
пустая строка преобразуется в false
Test 2.2: true
null и undefined при преобразовании к boolean оба дают false
Test 2.3: true
!!n = false, n (пустая строка) тоже false

Test 3: false
{}.a — undefined, {}.b — тоже undefined. Они равны

Test 4: undefined
C.a = 2 не создает новых членов в конструкторе C. Поэтому в объекте C a не определено.

Test 5: false
s.prototype — это отвлекающий маневр. prototype работает только на конструкторах (функциях). Поэтому s.b — undefined.
И здесь подковырка — равны ли 0 и undefined? Нет, не равны.

Test 6.1: undefined
У функции A нет свойства a.
Test 6.2: 4
Когда мы создавали x, в конструкторе A свойство a стало 4. Аргументы конструктора игнорировались.

Test 7: undefined
В функции func мы смотрели, больше undefined нуля, меньше или равно. Ни одно из условий не верно. Все три if не сработают. Вернется undefined.
Это, кстати, хороший подвох. Я один раз попался в программе.

Test 8: ReferenceError: NAN is not defined
Здесь произойдет исключение при проверке tst > NAN. NAN — неопределенный символ (в отличие от NaN).
Кстати, при сравнении tst > window.NAN исключения бы не произошло.

Test 9.1: true
Переменная x была создана в глобальном контексте — т.е. она член window. При запуске функции this = window. То есть это условие верно.
Test 9.2: true
Да, window.x равна undefined.
Test 9.3: true
Вот здесь интересный момент. Что такое undefined на самом деле? Это переменная window.undefined. В ранних версиях браузера ее можно было переопределить.

Test 10: 3undefined
Переменная m создается как экземпляр класса B — в конструктор передается число 3. Свойство a у m устанавливается в 3 в конструкторе.
У j в конструктор передается arg = undefined. Соответственно, и свойство a такое же.

Теги:
Хабы:
Всего голосов 41: ↑12 и ↓29-17
Комментарии22

Публикации

Истории

Работа

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
26 октября
ProIT Network Fest
Санкт-Петербург
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань