Почему мы должны использовать классы ES6?

Классы ES6 предоставляют гораздо более простой и понятный синтаксис для создания объектов и работы с наследованием. В первую очередь они являются синтаксическим сахаром по сравнению с существующим в JavaScript наследованием на основе прототипов. Это делает ваш код более читабельным и организованным.

Пример:

class Rectangle {
    constructor(height, width) {
        this.height = height;
        this.width = width;
    }
}

Что вы думаете о AMD и CommonJS?

Обе системы являются модульными. AMD (определение асинхронного модуля) оптимизировано для среды браузера и поддерживает асинхронную загрузку модулей, что полезно, когда у вас много зависимостей. CommonJS загружается синхронно, что делает его более простым API и лучше подходит для разработки на стороне сервера. Сегодня набирают популярность модули ES6 (ESM), которые стандартизированы и работают как синхронно, так и асинхронно.

Какой предпочтительный синтаксис для определения перечислений в JavaScript?

JavaScript изначально не поддерживает перечисления. Однако вы можете имитировать их, используя простые объекты:

const Days = {
    MONDAY: 'Monday',
    TUESDAY: 'Tuesday',
    // ...
};

Когда мы должны использовать генераторы в ES6?

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

Пример:

function* idGenerator() {
    let id = 0;
    while (true) {
        yield id++;
    }
}

Каков типичный вариант использования анонимных функций?

Анонимные функции часто используются в качестве аргументов для других функций, в обратных вызовах или для инкапсуляции в выражениях немедленно вызываемых функций (IIFE).

Пример:

setTimeout(function() {
    console.log('This is an anonymous function!');
}, 1000);

Что такое замыкание и как/почему вы его используете?

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

function outerFunction(outerVariable) {
    return function innerFunction(innerVariable) {
        console.log('outerVariable:', outerVariable);
        console.log('innerVariable:', innerVariable);
    }
}
const newFunction = outerFunction('outside');
newFunction('inside');  // logs both 'outside' and 'inside'

Объясните разницу между Object.freeze() и const

Object.freeze() используется для того, чтобы сделать объект неизменным, то есть вы не можете изменить его свойства. const используется для объявления переменной, которую нельзя переназначить. Однако, если константная переменная является объектом, свойства объекта все же можно изменить.

Пример:

const obj = {prop: 42};
obj.prop = 33; // Works, the property can be modified.
Object.freeze(obj);
obj.prop = 10; // Doesn't work, the object is now immutable.

Почему расширение встроенных объектов JavaScript не является хорошей идеей?

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

Что такое генератор в JS?

Генератор — это функция, в которую можно войти и выйти несколько раз. Они определяются с использованием синтаксиса function*. Генераторы могут приостанавливать выполнение с помощью ключевого слова yield и возобновлять с помощью метода .next().

Объясните Function.prototype.bind.

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

Пример:

const module = {
  x: 42,
  getX: function() {
    return this.x;
  }
};
const unboundGetX = module.getX;
console.log(unboundGetX()); // undefined, because 'this' is not bound
const boundGetX = unboundGetX.bind(module);
console.log(boundGetX()); // 42, because 'this' is now bound to 'module'

Предложите один простой способ удаления дубликатов из массива с помощью ES6.

Вы можете использовать Set для простого удаления дубликатов из массива в ES6:

const array = [1, 2, 3, 4, 4, 5, 5];
const uniqueArray = [...new Set(array)];
console.log(uniqueArray); // [1, 2, 3, 4, 5]

В чем разница между событием загрузки документа и событием документа DOMContentLoaded?

Событие DOMContentLoaded запускается, когда исходный HTML-документ полностью загружен и проанализирован, не дожидаясь завершения загрузки таблиц стилей, изображений и подфреймов. Событие load запускается, когда загружается вся страница, включая все зависимые ресурсы, такие как таблицы стилей и изображения.

Какие преимущества дает использование стрелочных функций?

Стрелочные функции имеют более короткий синтаксис по сравнению с функциональными выражениями. У них также нет собственных this, arguments, super или new.target, что упрощает их использование в качестве функций обратного вызова или внутри других функций.

Что такое экспорт по умолчанию в JavaScript?

export default используется, когда вы хотите экспортировать отдельный класс, функцию или примитив из файла сценария. Он используется в синтаксисе модуля ES6 и может быть импортирован под любым именем в другой файл скрипта. Пример:

// myFunction.js
export default function () { console.log('Hello!'); }
// app.js
import myFunction from './myFunction';
myFunction(); // Logs 'Hello!'

Какое новое ключевое слово в JavaScript?

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

Пример:

function Car(make, model) {
  this.make = make;
  this.model = model;
}
const myCar = new Car('Toyota', 'Corolla');
console.log(myCar.make); // Toyota
console.log(myCar.model); // Corolla

Объясните наследование прототипов в JavaScript.

В JavaScript объекты наследуются от других объектов. Это известно как наследование на основе прототипов или прототипное наследование. Когда объект получает запрос на свойство, которого у него нет, его прототип будет искать свойство, затем прототип прототипа и так далее, пока либо свойство не будет найдено, либо не будет достигнут конец цепочки прототипов.

Пример:

function Animal(name) {
  this.name = name;
}
Animal.prototype.speak = function () {
  console.log(this.name + ' makes a noise.');
}
function Dog(name) {
  Animal.call(this, name);
}
Dog.prototype = Object.create(Animal.prototype);
const dog = new Dog('Rex');
dog.speak(); // Rex makes a noise.

Что означает термин Транспилинг?

Транспиляция — это процесс преобразования исходного кода с одного языка или языковой версии на другой. Он обычно используется в JavaScript для преобразования кода из современного синтаксиса ES6+ в синтаксис ES5 для лучшей совместимости с браузерами.

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

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

Проверить, является ли заданная строка изоморфной.

Две строки изоморфны, если символы в строке A можно заменить, чтобы получить строку B. Пример:

function isIsomorphic(s, t) {
  if (s.length !== t.length) return false;
  const mapS = {};
  const mapT = {};
  for (let i = 0; i < s.length; i++) {
    if (!mapS[s[i]]) mapS[s[i]] = t[i];
    if (!mapT[t[i]]) mapT[t[i]] = s[i];
    if (mapS[s[i]] !== t[i] || mapT[t[i]] !== s[i]) return false;
  }
  return true;
}
console.log(isIsomorphic('egg', 'add')); // true

Объясните шаблон проектирования прототипа.

Шаблон проектирования прототипа включает создание объектов на основе шаблона существующего объекта посредством клонирования. Он используется, когда тип создаваемых объектов определяется прототипом, который клонируется для создания новых объектов.

Пример:

function Vehicle(vehicleType) {
  this.vehicleType = vehicleType;
}
Vehicle.prototype.clone = function() {
  return new Vehicle(this.vehicleType);
}
const proto = new Vehicle('Car');
const clonedVehicle = proto.clone();
console.log(clonedVehicle.vehicleType);  // 'Car'