Какво е Callback Hell и каква е основната причина за него?

Адът на обратното извикване, известен също като Pyramid of Doom, се отнася до ситуацията, при която обратните извиквания са вложени в тях, което води до код, който е труден за четене и поддръжка. Това се дължи главно на лошо структуриране на асинхронни операции.

firstFunction(args, function() {
  secondFunction(args, function() {
    thirdFunction(args, function() {
      // And so on...
    });
  });
});

Каква е разликата между шим и полифил?

Shim срещу Polyfill: Shim е библиотека, която пренася нов API в по-стара среда, действайки като слой за съвместимост. Полифилът е вид подложка, която модернизира по-стари среди с модерни функционалности на JavaScript, които те изначално не поддържат.

Какво е IIFE (незабавно извикани функционални изрази)?

IIFEs: An Immediately Invoked Function Expression е функция, която се създава и изпълнява веднага щом бъде дефинирана.

(function() {
  // statements
})();

Какво е принуда в JavaScript?

Принудата в JavaScript се отнася до преобразуването на един тип в друг (като низ в число, обект в булево и т.н.).

let num = "3";
console.log(num + 7); // "37", num was treated as string.

Каква е разликата между Anonymous и Named функции?

Наименуваните функции се декларират с име, докато анонимните функции нямат име. Наименуваните функции имат предимството, че могат да бъдат извиквани рекурсивно и се появяват в следите на стека, което подпомага отстраняването на грешки.

// Named function
function named() {
  // ...
}

// Anonymous function
let anonymous = function() {
  // ...
};

Опишете концепцията за затваряне в JavaScript възможно най-добре

Затварянето е функция, която има достъп до родителския обхват, дори след като родителската функция е затворена.

function outerFunction(outerVariable) {
  return function innerFunction(innerVariable) {
    console.log('outer:', outerVariable);
    console.log('inner:', innerVariable);
  }
}

const newFunction = outerFunction('outside');
newFunction('inside'); // logs: "outer: outside" and "inner: inside"

Как да сравним два обекта в JavaScript?

В JavaScript сравняването по референция проверява дали два обекта сочат към едно и също място в паметта, а не дали имат едно и също съдържание. За да сравните дали имат едно и също съдържание, трябва ръчно да проверите всяко свойство.

const isEqual = (obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2);

Бихте ли обяснили разликата между ES5 и ES6

ES5 срещу ES6: ES6 или ES2015 въведе нови функции като функции със стрелки, класове, шаблонни низове, деструктуриране, параметри по подразбиране и други, които не бяха налични в ES5.

Какъв е недостатъкът на създаването на истински частни в JavaScript?

В JavaScript няма вградена концепция за частно. Можем да го имитираме, но това може да доведе до увеличено използване на паметта, тъй като за всеки екземпляр се създава ново копие на функцията.

Обяснете разликата между недефинирани и недефинирани в JavaScript

Недефинирано спрямо недефинирано: undefined означава, че променлива е декларирана, но все още не й е присвоена стойност. Не е дефинирано означава, че променливата изобщо не е декларирана.

Какви са предимствата и недостатъците на използването на use strict?

Директивата ‘use strict’ ​​помага при улавянето на често срещани грешки в кодирането, като недекларирани променливи. Въпреки това, това прави обратната съвместимост проблем, тъй като някои кодове, които не използват строг режим, може да имат променливи, които се използват, преди да бъдат дефинирани.

Какво е определението за функция от по-висок ред?

Функция от по-висок ред е функция, която приема една или повече функции като аргументи, връща функция или и двете.

const add = (a, b) => a + b;
const calculate = (fn, a, b) => fn(a, b);

calculate(add, 5, 7); // returns 12

Обяснете разликите в използването на foo между функцията foo() {} и var foo = function() {}

Декларация на функция срещу израз на функция: Декларацията на функция дефинира функция и не изисква променлива, която да я задържи. Функционалните декларации се повдигат. Функционалните изрази дефинират функция в израз и не се повдигат.

// Function declaration
function foo() { /*...*/ }

// Function expression
var foo = function() { /*...*/ };

Каква е разликата между използването на let и var за деклариране на променлива в ES6?

let vs var: var е с функционален обхват, докато let е с блоков обхват. var променливите могат да бъдат актуализирани и повторно декларирани в неговия обхват; let променливите могат да бъдат актуализирани, но не и повторно декларирани.

Какви са ползите от използването на синтаксис за разпространение в ES6 и как се различава от синтаксиса на останалите?

Синтаксисът на разпространение разширява масива в неговите елементи или обект в неговите свойства. Синтаксисът Rest се използва за събиране на множество елементи и кондензирането им в един.

// Spread
let arr1 = [1, 2, 3];
let arr2 = [...arr1, 4, 5]; // [1, 2, 3, 4, 5]

// Rest
function foo(...args) {
  console.log(args);
}

foo(1, 2, 3, 4, 5); // logs: [1, 2, 3, 4, 5]

Какво е къри?

Curry е техника, при която функция с множество аргументи се разделя на множество функции, всяка с един аргумент.

function curry(a) {
  return function(b) {
    return a + b;
  }
}

const add5 = curry(5);
add5(3); // returns 8

Какви са разликите между функционалните конструктори на клас ES6 и ES5?

ES6 клас срещу ES5 функционални конструктори: Синтаксисът на класа в ES6 е синтактична захар над съществуващото базирано на прототип наследяване в ES5 функционалните конструктори. Те основно правят едно и също нещо по различни начини.

Кога трябва да използвам функции със стрелки в ES6?

Функциите със стрелки предоставят кратък синтаксис за писане на функции. Те са най-подходящи за неметодични функции и не могат да се използват като конструктори. Функциите със стрелки също нямат собствена стойност this; те наследяват this от включващата функция.

Каква е мотивацията за въвеждане на Symbol в ES6?

Типът Symbol е нов примитивен тип в ES6. Използва се главно за създаване на уникални идентификатори за свойства на обекти, което може да помогне за предотвратяване на сблъсъци на имена.

Каква е разликата между .call и .apply?

.call срещу .apply: И call, и apply се използват за извикване на функции и първият параметър ще се използва като стойност на this във функцията. Разликата между тях е, че call приема аргументи, разделени със запетая след първия аргумент, докато apply приема масив от аргументи.

function greet(arg1, arg2) {
  console.log(`${this.name} says ${arg1} and ${arg2}`);
}

const obj = {name: 'John'};

// Using .call
greet.call(obj, 'Hello', 'Good morning');

// Using .apply
greet.apply(obj, ['Hello', 'Good morning']);