Мы вам перезвоним – Telegram
Мы вам перезвоним
4.03K subscribers
8 photos
1 video
38 links
Выкладываю и разбираю вопросы, которые встречаются на собеседованиях по фронтенду
Вопросы присылайте @djamah
Download Telegram
Channel photo updated
Всем привет, итак, #Задачка1, на смекалочку, легенькая:

var arr = [1,2,42,3];
var brr = [];

for (var i = 0; i < arr.length; i++) {
if (arr[i] === 42) {

}

brr.push(arr[i]);
}

Нужно написать тело ифа как можно короче, чтоб в итоге массив brr был такой [1,2,3]

Спасибо Марине за вопрос, свои присылайте мне на @djamah
Правильный ответ будет завтра.
Ответ к #Задачка1

Первым делом, конечно же (возможно не у всех), в голову начинают лезть всякие сложные варианты с переназначением массива, слайсами и сплайсами, это все глупости — гоните их из головы.
Потом приходит более светлая мысль: ну если последняя строка в теле цикла добавляет элемент в массив, может, мы ее как-то пропустим? Пропустим... о, точно, continue
Но в задании было не 'как можно проще', а 'как можно короче' и если чуть подумать, то становится очевидно, что лучше чем пропускать итерацию цикла будет просто текущую превратить в следующую.
Самый короткий вариант:
i++;
Часто у меня спрашивают что-то вроде: а такой вопрос вообще нормально на джуниорском собеседовании задавать?
Друзья, любой вопрос можно задавать на любом собеседовании, а вот ответ может быть разного уровня.
В сегодняшней задачке будет очень простой вопрос, а завтра я опубликую, как, на мой взгляд, на него могли бы ответить джуниор и синьер

#Задачка2:
Чем отличаются var, let и const?
На первый взгляд вопрос очень ламерский, но нужно помнить, что на любом собесе нужно не только ответить на поставленный вопрос, но и показать, что вы умнее остальных)
Подумайте пока, как бы вы ответили на такой вопрос, а завтра я выложу свой вариант.
Доброе утро всем!
Написал ответ к прошлой задачке поздно ночью, но решил вас не будить, почитайте сейчас и хорошего вам дня)

Ответ к #Задачка2
Можно, конечно, сказать просто:
var объявляет переменные с функциональной областью видимости, а let и const c блочной, при этом const нельзя менять.
И это просто правильный ответ.
А можно ответить более развернуто:
Ключевые слова var, let и const используются для создания переменных.
var означает функциональную область видимости переменной, то есть переменная видна внутри функции и даже до ее объявления, правда до этого объявления она будет равна undefined.
let и const означают блочную область видимости и до объявления не видны, при попытке обращения интерпретатор выдаст ошибку.
Ключевое слово const создает константу, то есть переменную, которую нельзя менять, при попытке ее изменить интерпретатор выбросит исключение.
При этом нужно помнить, что неизменность этих констант касается прежде всего примитивных типов, а в объектных невозможно присвоить новый массив/объект/функцию, а изменить текущий вполне можно, например код:
const o = {};

o.name = 'yura';

будет вполне корректным.
Транспайлеры es2015 преобразовывают и let, и 'const' в обычные var, области видимости разруливают на уровне генерации имен, а проверку константности делают просто статическим анализом кода.

Вот таких вот два ответа на один вопрос, развернутый можно продолжать и дополнять, но думаю основная идея понятна)

Напоминаю, свой вопрос можно присылать мне на @djamah
#Задачка3
Очень клевая проверка, понимает ли человек, что означает 'передать по ссылке' и 'по значению':
var a = {};

(function b ( a ) {
a.a = 10;
a = null;
})( a );

console.log(a);

Что мы увидим в консоли? Почему?
👍1
Тем временем уже выложили видео моего выступления, на котором большинство из вас узнало об этом канале
https://www.youtube.com/watch?v=ncaWoyLINoI
Когда это видео наберет 1000 лайков, мы сделаем его вторую часть)
В общем, все как обычно, ставим лайк, подписываемся на канал, шарим видео.
Говорят, что тем, кто расшарит это все, будет пожизненно везти на собесах)
Ответ к #Задачка3
Для понимания проблемы важно помнить, что локальная переменная — это не только та, которая создана с ключевым словом var, но и та, которая параметр функции.

Дальше передам слово Диме, который прислал мне ответ с отличной формулировкой:
«В консоль выведется { a: 10 }
В функцию передаётся пустой объект, ссылка на него присваивается внутренней [локальной] переменной a, далее в объект записывается свойство a (по ссылке), далее внутренней переменной присваивается значение null и ссылка на него теряется, а вот у внешней a - остаётся.»
#Задачка4
Вот есть у нас такой код
var obj = {
a: function(){
console.log(this.prop);
},
prop: 1
};

obj.a.prop = 2;
obj.a();
var fn = obj.a;
fn();

Что выведется в консоль? Почему? Какая строка здесь, чтоб вас запутать?
Ответ на #Задачка4, который прислала Марина и он абсолютно верный:

Выполнится 2 консоль лога, выведется сначала 1 а, потом undefined, потому что в первом случае this указывает на объект obj, в котором мы и находим значение свойства prop, а при втором вызове this ссылается на window. У объекта window нет свойства prop, соответственно, в консоли получаем undefined.

Запутать нас пытаются строкой obj.a.prop = 2; — может показаться, что 2 мы присваиваем в obj.prop.
На самом же деле мы создаем свойство prop у obj.a и уже в него присваиваем 2.