Какво е 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']);