# JavaScript-разработчик 1. Сколько типов данных существует в JS? > ***Ответ:*** > > 7 типов данных являются примитивами: > > *Boolean*, > *Null*, > *Undefined*, > *Number*, > *String*, > *Symbol* (для чего может быть использован?), > *BigInt* > и *Object* 2. Какими способами может быть объявлена переменная? В чем различия? > ***Ответ:*** > > * `var, let, const` > * **в области видимости, возможностях переобъявления и переприсваивания**, механизме всплытия 3. Что означает ключевое слово `this` в JS-коде? > ***Ответ:*** > > > В большинстве случаев значение `this` определяется тем, каким образом вызвана функция (объект, в контексте которого была вызвана функция). Значение `this` не может быть установлено путем присваивания во время исполнения кода и может иметь разное значение при каждом вызове функции 4. Методы функции `.bind()`, `.call()`, `.apply()` &mdash; что делают и в чём их отличия? > ***Ответ:*** > > позволяют задать контекст функции, к которой применяются > `.bind(<thisArg>[, <arg1>, ..., <argN>])` создаёт копию функции с заданным в первом аргументе контекстом, остальные аргументы передаются в порядке следования > `.call(<thisArg>[, <arg1>, ..., <argN>])` вызывает функцию с заданным в первом аргументе контекстом, остальные аргументы передаются в порядке следования > `.apply(<thisArg>[, argsArray])` вызывает функцию с заданным в первом аргументе контекстом, остальные аргументы передаются в виде массива 5. Что будет выведено в консоль при запуске данного кода в браузере? В node.js? Почему? https://replit.com/@OlegLevshin/Arrow-function-args-and-context ```javascript (function (context) { const f = () => console.log(this === context) f.call("Awesome thisArg!") })( typeof window !== 'undefined' && window || typeof global !== 'undefined' && global || {} ) ``` > ***Ответ:*** > > * `true` > * стрелочные функции игнорируют задаваемый им контект и `this` в них указывает на this лексической области видимости, в которой эта функция определена 6. Какие две парадигмы программирования распространены в JavaScript-мире? Расскажите об известных вам концепциях в рамках этих парадигм применительно к JS? > ***Ответ:*** > > Императивное программирование с ООП и функциональное программирование > ООП: прототипное наследование (в чём отличие от классического наследования?) > ФП: чистые функции, иммутабельность, функции первого порядка, функции второго порядка, замыкания, композиции 7. Что будет результатом выполнения кода ниже? Почему? https://replit.com/@OlegLevshin/Object-creation-from-null-prototype ```javascript const o1 = {} console.log(o1.toString()) const o2 = Object.create(null) console.log(o2.toString()) ``` > ***Ответ:*** > > * первый `console.log` &mdash; *[object Object]* > * второй `console.log` &mdash; *Uncaught TypeError: o2.toString is not a function* (ошибка, т.к. поиск метода происходит по цепочке типов и все объекты в JS автоматически наследуются от Object, но `o2` объект был создан без какого либо прототипа в своей основе) > * наследование в JS прототипно, можно использовать и классы, которые являются синтаксическим сахаром 8. Что такое *"мемоизация"*? Реализуйте простую функцию мемоизации: > ***Ответ:*** > > ```javascript >function memoize (fn) { > memoize.cache = {} > return function () { > const key = JSON.stringify(arguments) > let result = memoize.cache[key] > if(! result) { > result = fn.apply(this, arguments) > memoize.cache[key] = result > } > return result > }; >} > ``` 9. Что будет выведено в консоль при запуске данного кода в браузере? Как можно изменить код, чтобы вывод был предсказуемым? https://replit.com/@OlegLevshin/Clojures-and-scopes ```javascript for (var i=0; i < 5; i++) { setTimeout(() => { console.log(i) }, 0) } ``` > ***Ответ:*** > > * 5 раз цифра 5 > > ```javascript >for (var i=1; i <= 5; i++) { > (function (i) { > setTimeout(() => { > console.log(i) > }, 0) > })(i) >} > > /* or */ > >for (let i=1; i <= 5; i++) { > setTimeout(() => { > console.log(i) > }, 0) >} > ``` 10. Реализуйте функцию-обёртку `logger()`, применение которой к другим функциям позволит нам узнать, с какими аргументами эта функция вызывалась и что она вернула в результате: https://replit.com/@OlegLevshin/Logging-decorator-test > ***Ответ:*** > > ```javascript >const logger = function (fn) { > > const fnName = fn.name > > return function () { > > console.log(`Logger for ${fnName}:args:`, ...arguments) > > try { > const result = fn.call(this, ...arguments) > > if (result instanceof Promise) { > result > .then(r => console.log(`Logger for ${fnName}:promise:result`, r)) > .catch(e => console.error(`Logger for ${fnName}:promise:error`, e)) > } else { > console.log(`Logger for ${fnName}:result`, result) > } > > return result > } catch (e) { > console.error(`Logger for ${fnName}:error`, e) > throw e > } > } >} > ``` 11. Расскажите про асинхронность в JS. Зачем она нужна? С помощью каких подходов и конструкций языка может быть реализована? > ***Ответ:*** > > * асинхронность нужна для повышения производительности, организации неблокирующего ввода-вывода в силу однопоточной природы языка > * callbacks, promises, async/await 12. Допишите код так, чтобы в консоль вывелось **1, 2, 3, 4, 5** &mdash; т.е. чтобы промисы из данного массива были выполнены последовательно: https://replit.com/@OlegLevshin/DarkblueDarksalmonOmnipage > ***Ответ:*** > > ```javascript > // Нежелательный вариант > ;(async () => { > for (const p of promises) { > await p() > } > })() > > // Желательный вариант > let resolved = Promise.resolve() > for (const p of promises) { > resolved = resolved.then(p) > } > > // Также возможны варианты с рекурсией или .reduce() > ``` 13. Расскажите про модульные подходы в JS-разработке? > ***Ответ:*** > > * AMD, CommonJS, ESModules ~~14. Вопросы про Event Loop, браузерные API, фреймворки, особеноости node.js, собственные предпочтения и т.п.~~ #### Based on: https://medium.com/javascript-scene/10-interview-questions-every-javascript-developer-should-know-6fa6bdf5ad95 https://www.toptal.com/javascript/interview-questions https://github.com/ganqqwerty/123-Essential-JavaScript-Interview-Questions/blob/master/README.md https://codeburst.io/functional-memoization-in-javascript-adec62508bd0 https://www.gideonpyzer.com/blog/javascript-currying-and-partial-application/ https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questions.md