10 наиболее распространенных вопросов на собеседовании по JavaScript (часть 1)

Проходить JavaScript интервью всегда непростая задача. Вопросы могут быть из самых разных областей, в том числе включать в себя задачи из новой или старой версии языка. Особенности браузеров, работы с HTML, приемы и хитрости связанные с jQuery и т.д. Само собой разумеется, вопросы будут касаться и алгоритмических проблем, работы с данными, возможно даже спросят про некоторые фреймворки.

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

1. Какая разница между объявлением переменной через let и var?

Во-первых, var существует в языке с самого начала. Let появился в ES2015/ES6. Во-вторых, область видимости let ограничивается текущим блоком. Это означает, что переменная, объявленная таким образом, будет уничтожена после выполнения кода текущего блока. Var имеет область видимости, ограниченную функцией. То есть переменная будет уничтожена после выполнения текущей функции, а не блока. В-третьих, var «поднимается» в начало функции, в отличие от let. Имеется ввиду инициализация, а не присваивание значения:

let x = function() {
    if (true) {
        console.log(v); //undefined
        console.log(q); //Uncaught ReferenceError: q is not defined
        var v = 2;
        let q = 1;
       //q уничтожается здесь
    }
 //v уничтожается здесь
}
x();

Переменная q существует ровно до закрывающей фигурной скобки блока if. В то время как v будет «жить» до конца функции. Вероятность что вам зададут этот вопрос – 20%

2. Объясните разницу между «==» и «===»?

Двойной знак равенства и тройной – оба служат для сравнения. Первый сравнивает только значения, без учета их типа. Тройной сравнивает и значение и тип.

if (‘1’ == 1) //true
if (‘1’ === 1) //false

Рассмотрим, как работает сравнение в первом случае. Для того, чтобы определить равны ли значения, JavaScript сначала приводит их к одному и тому же типу. Слева, как мы видим, у нас строка. Справа – целое число. В данном случае, именно целое число будет приведено к строке, затем, сравнивая строки друг с другом, получим true.

Когда используется тройной знак равенства, приведение к типу не происходит, а сначала сравниваются типы (переменных, например), и только если они совпадают, сравниваются их значения. Вероятность вопроса на собеседовании – 30%

3. Разница между объявлением let и const?

Оба варианта используются для объявления переменных. Но const объявляет неизменяемую переменную, которой нельзя потом присвоить другое значение. Для сравнения значение let, можно переопределять столько раз, сколько потребуется. Вы можете даже изменить тип, если хотите.

let q = 1;
q = 2;
concole.log(q); //2
 
const c = 1;
c = 2;  //Uncaught TypeError: Assignment to constant variable.
console.log(c);

Более интересный вариант:

const c; //не присваиваем значение
с = 1; 	
console.log(c);

получим ошибку: Uncaught SyntaxError: Missing initializer in const declaration.

Еще один:

const c = [1,2];
c.push(3);
console.log(c); //(3) [1,2,3]

Ошибки нет! Мы можем изменять значения таким образом, потому что это объект. Но мы не можем переприсвоить, то есть, вместо c.push(3) написать c = [1,2,3].

4. Разница между «undefined» и «null»?

Ответ: оба варианта означают пустое значение. Если мы инициализируем переменную, но не присваиваем ей значение, туда помещается специальный «маркер», который отображается при выводе на экран как undefined. Null присваиваем самостоятельно. Если необходимо очистить значение переменной, мы делаем q = null.
Во-вторых:
typeof(undefined) => undefined
typeof(null) => object
С вероятностью 10% вам зададут данный вопрос.

5. Как использовать «стрелочные функции» (Arrow Functions)?

const profile = {
    firstName: ‘’,
    lastName: ‘’,
    setName: function(name) {
        let splitName = function(n) {
            let nameArray = n.split(‘ ‘);
            this.firstName = nameArray[0];
            this.lastName = nameArray[1];
       }
    splitName(name);
   }
}
 
profile.setName(‘John Doe’);
console.log(profile.firstName);

Результат будет пустым. Поскольку this в функции splitName указывает на объект window, а не на profile.
console.log(window.firstName); //John
Чтобы подобного не происходило, там следует использовать Narrow Function. Заменим часть кода, где объявляется splitName:

let splitName = (n) => {
    let nameArray = n.split(‘ ‘);
    this.firstName = nameArray[0];
    this.lastName = nameArray[1];
}

Теперь выполним console.log(profile.firstName); //John
Это и есть «стрелочная функция». Кстати, они появились с ES6. Поскольку у нее нет собственного this, контекст берется из setName, который принадлежит объекту profile. Вопрос будет с вероятностью 30%.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *