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