Предлагаю такую подборку вопросов, которую можно задать кандидату. Ответы выводятся во всплывающем окне.
Испытуемому предлагается предугадать, что появится в окне alert.
Главное здесь — нужно объяснить, почему был получен такой ответ.
Не страшно, если ответ отличается от действительного, потому что в вопросах есть подковырки. Тогда нужно будет объяснить, как получился такой результат.
Скопируйте код в консоль браузера или вставьте его на html страницу. После каждого alert'а спрашивайте у собеседуемого, что будет на следующем, и почему.
Итак, начнем:
Update:
Ответы на вопросы + комментарии:
Испытуемому предлагается предугадать, что появится в окне 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 такое же.
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 такое же.