Pull to refresh

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

Reading time3 min
Views10K
Предлагаю такую подборку вопросов, которую можно задать кандидату. Ответы выводятся во всплывающем окне.
Испытуемому предлагается предугадать, что появится в окне 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 такое же.

Tags:
Hubs:
Total votes 41: ↑12 and ↓29-17
Comments22

Articles