Превратите тревогу перед собеседованием в уверенность

1. Что такое JavaScript?

JavaScript — это высокоуровневый интерпретируемый язык программирования. Это язык, который также характеризуется как динамический, слабо типизированный, основанный на прототипах и мультипарадигмальный. JavaScript, используемый для улучшения взаимодействия с веб-страницами и предоставления интерактивных элементов пользовательскому интерфейсу, является неотъемлемой частью веб-приложений.

«Я всегда говорил, что Java для JavaScript — то же, что ветчина для хомяка!» — посмеивается ваш интервьюер.

Всегда помните, что, несмотря на сходство названий, Java и JavaScript — совершенно разные языки.

2. Какие существуют типы данных в JavaScript?

JavaScript имеет семь основных типов данных:

  1. Число. Представляет как целые числа, так и числа с плавающей запятой.
  2. Строка: последовательность символов, используемая для хранения текста.
  3. Boolean: True или False.
  4. Null: этот тип имеет только одно значение, null.
  5. Не определено: переменная, которой не присвоено значение.
  6. Объект: пары "ключ-значение" для сбора данных.
  7. Символ: используется для свойств анонимных объектов.

«Что, если я скажу вам, что null — это объект в JavaScript?» — спросите вы с ухмылкой.

Да, это забавная мелочь, что typeof null в JavaScript возвращает "object".

3. Как вы организуете свой код в JavaScript? Обсудите модули и синтаксис импорта/экспорта.

Организация вашего кода имеет решающее значение в больших приложениях JavaScript. Одним из эффективных способов сделать это является использование модулей. Модуль — это, по сути, отдельный файл JavaScript, содержащий функции или переменные, которые можно использовать в других файлах.

Синтаксис импорта/экспорта, представленный в ES6, позволяет легко использовать модули. Вы можете экспортировать функции, объекты или значения из модуля, добавив ключевое слово export перед их объявлением.

Вот пример:

// module.js
export const greet = () => {
  console.log("Hello, world!");
};

Чтобы использовать эту функцию в другом файле, вы должны использовать ключевое слово import:

// app.js
import { greet } from './module.js';
greet(); // Logs "Hello, world!"

4. Как работает прототипное наследование в JavaScript?

В JavaScript все объекты имеют скрытое свойство [[Prototype]], которое является либо другим объектом, либо null. Мы можем использовать его для добавления новых свойств или методов к существующим объектам. Это свойство используется JavaScript для целей наследования.

«Вы когда-нибудь чувствовали, что мы все просто прототипы более высокого объекта в JavaScript?» — размышляете вы вслух.

Ваш интервьюер приподнимает бровь, вероятно, добавляя дополнительный балл за креативность.

5. В чем разница между == и === в JavaScript?

Оператор == проверяет только равенство значений, тогда как оператор === проверяет и значение, и тип. Вот почему JavaScript иногда дает забавные результаты, например, 0 == false верно, а 0 === false ложно.

"Вы когда-нибудь думали, что в JavaScript "тройное равенство" более равно, чем "двойное равенство"? Захватывающая концепция, не правда ли?»

6. Какие существуют способы определения функции в JavaScript?

JavaScript предоставляет несколько способов определения функции:

  • Объявление функции: определяет именованную функцию.
function sayHello() {
    console.log('Hello!');
}
  • Выражение функции: определяет функцию в выражении.
var sayHello = function() {
    console.log('Hello!');
};
  • Функция стрелки. Представленная в ES6, она предоставляет новый синтаксис для определения функций.
const sayHello = () => console.log('Hello!');

«Если бы функции JavaScript были группой, держу пари, Arrow Function была бы классным новым барабанщиком!»

7. Что такое подъем в JavaScript?

Подъем — это механизм JavaScript, в котором объявления переменных и функций перемещаются в верхнюю часть их области видимости на этапе компиляции. Однако поднимаются только объявления, а не инициализация.

console.log(myVar); // Output: undefined
var myVar = 5;

"В стране JavaScript все стремится к вершине — это социальный альпинист среди языков программирования!"

8. Каково использование ключевого слова this в JavaScript?

В JavaScript ключевое слово this относится к объекту, свойством которого является функция. Значение this зависит от контекста вызова функции и от того, где она вызывается.

"Это только мне кажется или ключевое слово this имеет серьезные проблемы с идентификацией?"

9. Что такое цикл событий в JavaScript?

Цикл событий — это процесс в JavaScript, который обрабатывает внешние события и преобразует их в функции обратного вызова. Он отвечает за выполнение кода, сбор и обработку событий и выполнение поставленных в очередь подзадач. Цикл событий сделал JavaScript действительно асинхронным и, следовательно, неблокирующим.

"Что происходит, то происходит в цикле событий!"

10. Что такое обещание в JavaScript?

Промис в JavaScript — это объект, который в будущем может выдать единственное значение: либо разрешенное значение, либо причина, по которой оно не разрешено (например, сетевая ошибка).

let promise = new Promise(function(resolve, reject) {
  // A mock async action using setTimeout
  setTimeout(function() {
    resolve('Success!');
  }, 500);
});

promise.then(function(successMessage) {
  console.log(successMessage); // 'Success!'
});

"Обещания в JavaScript — как и ваши тренировки в спортзале, их еще может не быть, но они уже выполняются!"

11. Что такое остальные параметры и синтаксис распространения в JavaScript? Можете ли вы привести пример?

Параметр rest и синтаксис расширения — это две взаимосвязанные концепции в JavaScript, обе из которых включают оператор ....

Параметр rest позволяет функции принимать неопределенное количество аргументов в виде массива.

Вот пример:

function sum(...numbers) {
  let total = 0;
  for(let number of numbers) {
    total += number;
  }
  return total;
}
console.log(sum(1, 2, 3, 4)); // Logs 10

Синтаксис расширения, с другой стороны, позволяет расширять итерируемый объект, такой как массив, в местах, где ожидается ноль или более аргументов или элементов.

Например:

let arr1 = [1, 2, 3];
let arr2 = [...arr1, 4, 5];
console.log(arr2); // Logs [1, 2, 3, 4, 5]

12. Что такое IIFE (немедленно вызываемое функциональное выражение) в JavaScript?

IIFE — это функция JavaScript, которая запускается, как только она определена. Синтаксис следующий:

(function () {
    var message = 'Hello, World!';
    console.log(message); // 'Hello, World!'
})();

«IIFE — это гость на вечеринке, который появляется и тут же уходит. Никаких глупостей!»

13. В чем разница между null и undefined в JavaScript?

В JavaScript undefined означает, что переменная объявлена, но ей еще не присвоено значение. С другой стороны, null — это значение присваивания, которое не представляет ни значения, ни объекта.

“undefined похож на пустую коробку для завтрака, а null похож на коробку для завтрака с запиской "Сегодня обеда нет".

14. Каково назначение оператора typeof в JavaScript?

typeof — это оператор в JavaScript, который возвращает строку, указывающую тип операнда! Это полезно, когда вам нужно обрабатывать значения по-разному в зависимости от их типа данных.

console.log(typeof 'Hello World'); // Returns "string"

“‘typeof’: быстрый способ определить тип вашей переменной!”

15. Можете ли вы объяснить, что делает метод JavaScript bind()?

Метод bind() создает новую функцию, которая при вызове имеет ключевое слово this, установленное в указанное значение. Он обычно используется при работе с обработчиками событий и обратными вызовами, особенно в проектах React.js.

let obj = {
  num: 2
};

let addToThis = function(a, b, c){
  return this.num + a + b + c;
};

let bound = addToThis.bind(obj);

console.log(bound(1, 2, 3)); // Returns 8

"Bind(): ваш лучший друг, когда this не то, что вы думаете!"

16. Что такое функция обратного вызова JavaScript?

В JavaScript функция обратного вызова — это функция, передаваемая в другую функцию в качестве аргумента, которая затем вызывается внутри внешней функции.

function greeting(name) {
  alert('Hello ' + name);
}

function processUserInput(callback) {
  let name = prompt('Please enter your name.');
  callback(name);
}

processUserInput(greeting);

"Функции обратного вызова. Иногда JavaScript любит говорить: "Подождите, я вам перезвоню!"

17. Что такое стрелочные функции в JavaScript?

Стрелочные функции, представленные в ES6, предлагают более лаконичный синтаксис для написания функциональных выражений за счет пропуска ключевого слова function. Они также лексически связывают значение this и всегда анонимны.

let hello = name => `Hello, ${name}!`;
console.log(hello('World')); // 'Hello, World!'

"Стрелочные функции — хипстерский способ написания функций, скудный, подлый и очень чистый!"

18. Что делает «use strict» в JavaScript?

«use strict» — это буквальное выражение, которое было введено в ECMAScript 5. Это способ добровольно применить более строгий синтаксический анализ и обработку ошибок в вашем коде JavaScript.

"Используйте строгие правила: иногда вам просто нужно установить закон в своем кодексе!"

19. Что такое деструктурирующее присваивание в JavaScript?

Деструктурирующее присваивание в JavaScript — это синтаксис, который позволяет нам распаковывать значения из массивов или свойства из объектов в отдельные переменные.

let [x, y, ...rest] = [10, 20, 30, 40, 50];
console.log(x); // 10
console.log(rest); // [30, 40, 50]

"Разрушение структуры: зачем тратить время на доступ к элементам массива или свойствам объектов один за другим?"

20. Каковы преимущества и недостатки использования async/await в JavaScript?

Синтаксис async/await в JavaScript представляет собой комбинацию промисов и генераторов, чтобы уменьшить шаблон вокруг промисов и «синхронно» выполнять асинхронные действия.

Преимущества использования async/await включают:

  1. Делает асинхронный код похожим на синхронный. Это может облегчить чтение и понимание кода.
  2. Позволяет использовать обработку ошибок try/catch вместо .catch() для промисов.

К недостаткам async/await относятся:

  1. Это потенциально может создать проблемы с производительностью, поскольку блокирует выполнение вашего кода, что не всегда может быть лучшим подходом.
  2. Об обработке ошибок можно легко забыть, так как вам нужно помнить о заключении кода в блок try/catch. Если вы забудете, исключения останутся неперехваченными.
async function myFunction() {
  try {
    const result = await someAsyncCall();
  } catch (error) {
    console.error(error);
  }
}

21. Что такое шаблонные литералы JavaScript?

Литералы шаблонов JavaScript — это строковые литералы, допускающие встроенные выражения, многострочные строки и интерполяцию строк.

let name = 'John';
console.log(`Hello, ${name}!`); // Hello, John!

"Шаблонные литералы: обратные кавычки (`) становятся волшебной палочкой!"

22. Что такое генераторы JavaScript?

Генераторы — это специальные функции в JavaScript, из которых можно выйти, а затем снова войти с их контекстом (привязками переменных), сохраненным при повторных входах.

function* idMaker() {
  var index = 0;
  while (true)
    yield index++;
}

var gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1

«Генераторы: иногда функции JavaScript тоже любят делать перерывы!»

23. Что такое замыкание в JavaScript?

Замыкание в JavaScript — это функция, которая запоминает среду, в которой она была создана. Он имеет доступ к своей области видимости, области действия внешней функции и глобальной области видимости.

function outer() {
  let count = 0; 
  function increment() {
    count++;
    console.log(count);
  }
  return increment;
}

let myFunc = outer();
myFunc(); // 1
myFunc(); // 2

«Замыкания: они как личный дневник JavaScript — всегда помните обо всем!»

24. Объясните делегирование событий в JavaScript

Делегирование событий в JavaScript — это метод, в котором используется один прослушиватель событий для управления всеми событиями, которые могут произойти с определенными элементами или наборами элементов.

document.querySelector('body').addEventListener('click', function(event) {
  if(event.target.tagName.toLowerCase() === 'button') {
    console.log('Button clicked!');
  }
});

"Делегирование событий: потому что иногда легче слушать слухи!"

25. Как JavaScript обрабатывает асинхронные операции?

JavaScript обрабатывает асинхронные операции с обратными вызовами, промисами и async/await. Эти функции позволяют JavaScript выполнять другие задачи, не дожидаясь завершения асинхронной операции.

«Асинхронные операции: например, стирка во время просмотра телевизора. Обе задачи выполняются, просто не одновременно!»

26. Как глубоко клонировать объект в JavaScript?

Одним из распространенных способов глубокого клонирования объекта в JavaScript является использование методов JSON.parse и JSON.stringify.

let obj = {a: 1, b: 2};
let cloneObj = JSON.parse(JSON.stringify(obj));

"Глубокое клонирование: потому что иногда ксероксная копия недостаточно хороша!"

27. Что такое NaN в JavaScript?

NaN означает «не число». Это специальное значение, указывающее, что в математической операции использовалось нечисловое значение.

console.log(Math.sqrt(-1)); // NaN

"NaN: способ JavaScript сказать: "Хорошая попытка, но это не число!"

28. Как создать класс JavaScript?

В JavaScript классы — это специальные функции, которые можно определить с помощью ключевого слова class.

class MyClass {
  constructor(name) {
    this.name = name;
  }
}
let obj = new MyClass('John');

"Классы JavaScript: как формочки для печенья для ваших объектов кода!"

29. Что такое «новое» ключевое слово в JavaScript?

Ключевое слово «новое» в JavaScript используется для создания экземпляра определяемого пользователем типа объекта или одного из встроенных типов объектов.

let myDate = new Date();

«Новинка»: волшебное слово, позволяющее оживить объекты JavaScript!»

30. Как JavaScript обрабатывает асинхронные операции? Опишите на примерах.

Асинхронные операции — ключевая особенность JavaScript, позволяющая выполнять несколько действий одновременно. JavaScript может выполнять код, ожидая завершения других операций, таких как выборка данных. Это достигается с помощью различных методов, таких как обратные вызовы, промисы и синтаксис async/await.

Базовым примером асинхронных операций является функция setTimeout, которая планирует выполнение кода после заданного периода времени, не блокируя при этом выполнение последующего кода.

Например:

console.log("First");
setTimeout(() => {
  console.log("Second");
}, 2000);
console.log("Third");

В приведенном выше примере вывод будет «Первый», «Третий» и «Второй», потому что setTimeout не блокирует, а остальная часть кода продолжает выполняться.









Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу