…Нужно усвоить основы, потому что иначе модные штуки не сработают».
– Рэнди Пауш

Проходить собеседования при приеме на работу — это здорово. Собеседования сами по себе — это здорово. Послушайте, как старшие разработчики рассказывают о своей работе. Заглянуть за кулисы интересных компаний. Ощущение, что я приближаюсь к своей первой роли. При всем ощущении достижения, которое я испытал после завершения моего буткемпа и создания Lockdown Listens, выход на рынок труда заставил меня почувствовать себя Гомером Симпсоном на Мердерхорне, понимая, что вершина была просто плато. Не только это, но и уроки, которые я усвоил, делая свои первые шаги — уроки, которые кажутся далекими воспоминаниями — будут так же важны на финальном восхождении, как и в базовом лагере.

TypeScript и GraphQL — это круто. Изысканный. Я был бы дураком, если бы хотя бы не ознакомился с ними — они фигурируют в восьми из десяти объявлений о вакансиях. Но этот пост не о причудливых вещах. На собеседованиях по поводу вакансий, требующих знания TS, большинство работодателей хотят видеть, что я понимаю выгоду, а не только особенность, и я это понимаю. Вещи, которые поставили меня в тупик, были вопросы об основах. Вещи, которым не могут научить никакие вызовы CodeWars и возня с React.

Рискуя показаться совершенно неуместным, вот несколько вопросов, которые поставили меня в тупик в недавнем интервью.

  • В чем разница между var и let с точки зрения области действия?
  • В чем разница между null и undefined и являются ли они обоими типами?
  • Что происходит?

В свою защиту скажу, что я только что вернулся из отпуска, где заболел бронхитом. Но здесь есть чему поучиться…

Есть разница между знанием когда использовать вещи и знанием почему я их использую. Метод проб и ошибок работает, но тратит много времени. Рекрутеры хотят знать, что я не спотыкался на своем буткемпе, держа Мерла и Оли за руки (спасибо, ребята), поэтому важно иметь возможность объяснять, объяснять, расширять основы. Итак, вот. Эти объяснения адресованы мне примерно летом 2020 года, ясноглазому, пушистому и в значительной степени невежественному. Ты сможешь, чемпион!

var, пусть и объем

ES6 представил let и const. К переменным, объявленным с помощью этих ключевых слов, нельзя получить доступ за пределами блока, в котором они объявлены.

С другой стороны, переменные, объявленные с помощью var, существуют в глобальной области видимости. Доступ к ним возможен из любого места.

Дух.

ноль против неопределенного

Во-первых, оба типа! Кажется, я сказал своему интервьюеру, что undefined — это не тип, а null. Я не знаю, о чем я думал. Я же говорю, бронхит.

Размышляя над своим ответом, я могу вспомнить варианты использования null, которых у меня не было под рукой во время интервью. Я думаю, что хорошим ответом было бы что-то вроде:

«Undefined используется компилятором для описания переменных, которые не указывают на ссылку. Когда я кодирую, для меня это бесполезно.
С другой стороны, если я хочу объявить пустой объект, который, как я ожидаю, будет заполнен, я могу инициировать его с нулевым значением. Например, я мог бы захотеть условно отобразить компонент, когда некоторые данные существуют после ввода пользователем. Перед этим вводом он все еще должен быть определен, поэтому я бы использовал null в качестве заполнителя».

Что поднимает?

Сколько себя помню, я объявлял свои переменные в начале своего кода. Кажется очевидным, что я буду создавать ссылки на вещи до использования этих ссылок. Когда я это делаю, я выполняю работу компилятора — поднимаю!

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

var declaration;                     // this WILL be hoisted 
var newVariable = "initialized"      // this will NOT
let hoisted;                         // this WILL be hoisted
                                        but not initialized!

Как обычно, лучшие примеры взяты из MDN Docs. В приведенном ниже объявление функции поднимается над вызовом функции, поэтому оно работает как обычно.

catName(“Chloe”);
function catName(name) {
 console.log(“My cat’s name is “ + name);
}
/*
The result of the code above is: “My cat’s name is Chloe”
*/

Вот еще один пример, демонстрирующий два момента, просто чтобы еще больше запутать...

В этом примере let num; является объявлением, а num = 5; является инициализацией. Поднимется толькообъявление. Несмотря на то, что объявления let и const подняты, они не инициализируются значением undefined по умолчанию, отсюда и большое красное сообщение. Откуда мы знаем, что let num; был поднят? Потому что, если бы это было не так, ошибка сообщила бы нам n is not defined.

С таким большим допуском на ошибку имеет смысл объявлять все переменные в начале каждой области видимости. Я всегда так делал, но теперь могу объяснить, почему. Знать — это одно, понимать — совсем другое. Я должен работать над пониманием.