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

Загадочный случай NaN

NaN означает «не число», и это специальное значение в JavaScript, представляющее неопределенное или непредставимое значение. Но знаете ли вы, что NaN ничему не равен, в том числе и самому себе? Верно, NaN !== NaN. Как будто NaN — это призрак, который даже не может видеть себя в зеркале.

console.log(NaN === NaN); // false
console.log(NaN == NaN); // false

Запутанная правда о типах

JavaScript — это язык с динамической типизацией, что означает, что переменные могут изменять свой тип во время выполнения. Но знаете ли вы, что тип оператора иногда может возвращать неожиданные результаты? Например, тип null возвращает «object», а не «null». А тип NaN возвращает «число», а не «Не число». Это похоже на то, как тип оператора играет в игру «угадай мой тип» и намеренно ошибается.

console.log(typeof null); // object
console.log(typeof NaN); // number

Скрытая сила точки с запятой

В JavaScript точки с запятой необязательны, но знаете ли вы, что иногда они могут изменить смысл вашего кода? Например, рассмотрим этот невинно выглядящий код:

function foo() {
  return
  {
    bar: 42
  };
}
console.log(foo()); // undefined

Ожидали ли вы, что foo() вернет объект со свойством bar? Что ж, сюрприз! Из-за отсутствия точки с запятой после оператора return JavaScript автоматически вставляет точку с запятой, превращая ваш код в:

function foo() {
  return;
  {
    bar: 42
  };
}
console.log(foo()); // undefined

Теперь ясно, что foo() возвращает undefined, а не объект. Так что помните, всегда используйте точку с запятой, если вы не хотите играть в игру «угадай, что означает мой код».

Странный мир правды и лжи

В JavaScript не все верно или ложно. Существуют также истинные и ложные значения, которые приводятся к истинным или ложным в логическом контексте. Но знаете ли вы, что некоторые ценности не являются ни истинными, ни ложными? Например, NaN, null, undefined и пустая строка являются ложными. Но то же самое можно сказать и о 0, который кажется вполне допустимым числом. И строка «false» является истинной, хотя это и не логическое значение false. Это похоже на то, как правдивость и ложь играют в игру «кто настоящий булев».

console.log(Boolean(NaN)); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean('')); // false
console.log(Boolean(0)); // false
console.log(Boolean('false')); // true

Непредсказуемое поведение этого

В JavaScript это ключевое слово является ссылкой на объект, который «владеет» текущим кодом. Но знаете ли вы, что значение этого иногда может быть неожиданным? Например, в функции, вызываемой из глобальной области, это относится к глобальному объекту (окну в браузере, глобальному в Node.js). А во вложенной функции this может ссылаться на неправильный объект или даже на undefined. Это похоже на игру «Где я?» и заблудиться.

var obj = {
  foo: function() {
    console.log(this);
  },
  bar: {
    baz: function() {
      console.log(this);
    }
  }
};
obj.foo(); // obj
obj.bar.baz(); // bar object, not obj

Заключение

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

Спасибо за чтение!

Вот несколько ресурсов для изучения продвинутого JavaScript:

  • Веб-документы MDN:это отличный ресурс для изучения передовых концепций JavaScript, включая новейшие функции в ES6 и более поздних версиях. Даются четкие пояснения и практические примеры.
  • JavaScript.info: этот веб-сайт предлагает всестороннее и подробное руководство по JavaScript, охватывающее все, от основ до продвинутых концепций, таких как замыкания, прототипы и асинхронность/ Ждите.
  • Eloquent JavaScript: эта книга Марин Хавербеке является настоятельно рекомендуемым ресурсом для изучения продвинутого JavaScript. Он охватывает такие темы, как функции высшего порядка, объектно-ориентированное программирование и асинхронное программирование.
  • Вы не знаете JS: это серия книг Кайла Симпсона, посвященная внутренней работе JavaScript. Он охватывает такие темы, как область действия и замыкания, ключевое слово this и асинхронное программирование.
  • Frontend Masters:это онлайн-платформа для обучения, которая предлагает курсы по различным сложным темам JavaScript, таким как функциональное программирование, React и Node.js.
  • Надеюсь, эти ресурсы помогут вам освоить расширенный JavaScript!

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.