В предыдущей части мы немного познакомились с историей JavaScript и рассмотрели одну из самых важных концепций: не все, что вы видите в коде JavaScript, — это JavaScript.

В этой части я начну рассматривать небольшие части JavaScript, и одна из них — «примитивные значения», которые мы используем в качестве строительных блоков для любой программы.

Возможно, вы слышали: «В JS все является объектом». Это большое заблуждение, потому что большинство значений в JS могут вести себя как объекты.

В JavaScript есть 8 встроенных типов. Набор типов в языке JavaScript состоит из примитивных значений и объектов.

В JavaScript у переменных нет типов — у значений есть типы. Переменные могут содержать любое значение в любое время.

Все примитивные значения являются неизменяемыми, что означает, что вы не можете изменять их значения. Когда мы переназначаем переменную, присваивая ей новое значение, мы не меняем само значение; мы только меняем значение, на которое ссылается переменная. Это важно понимать.

Числа

В JavaScript есть три специальных значения, которые считаются числами, но ведут себя не как обычные числа.

Первые два — это Infinity и -Infinity, которые представляют положительную и отрицательную бесконечности».

Третий — NaN, и он означает «не число», хотя это значение числового типа.

Также наиболее распространенная проблема с числами JavaScript:

0.1 + 0.2; // 0.30000000000000004

0.1 + 0.2 === 0.3 // will be always false

Поэтому мы должны быть очень осторожны, когда работаем с числами JavaScript.

нулевой и неопределенный

Разница в значении между undefined и null — это случайность дизайна JavaScript.

Все, что отслеживается JavaScript, связано. На самом деле определение undefined означает, что JavaScript не может найти связанный идентификатор.

Вы можете подумать, что undefined означает, что переменная была объявлена, но ей еще не присвоено значение (НО ЭТО НЕ ВСЕГДА ВЕРНО), а null — это значение присваивания.

тип и экземпляр

Оператор typeof проверяет, принадлежит ли значение одному из 7 основных типов: number, string, boolean, object, symbol, function или undefined. Где “object" относятся ко всем объектам (кроме функций, которые являются объектами, но имеют собственное значение в операторе typeof), а также null значение и массивы (для null это ошибка, но это ошибка настолько старая, что стала стандартной). Он не зависит от конструкторов и может использоваться, даже если значение не определено. Но он не дает никаких подробностей об объектах. Так что, если вам это нужно, идите к instanceof.

Оператор instanceof используется для определения того, относится ли тип к конкретной функции-конструктору.

Ложные значения

JavaScript – это язык со свободной типизацией. Это означает, что всякий раз, когда оператор или оператор ожидает определенный тип данных, JavaScript автоматически преобразует данные в этот тип.

Ложное значение — это значение, которое считается false при встрече в логическом контексте.

Преобразование типов, также известное как приведение типов

Когда оператор применяется к «неправильному» типу значения, JavaScript незаметно преобразует это значение в нужный ему тип, используя набор правил, которые часто не соответствуют вашим ожиданиям или ожиданиям. Это называется приведением типов.

Преобразование типов похоже на приведение типов, поскольку оба они преобразуют значения из одного типа данных в другой с одним ключевым отличием — приведение типов является неявным, тогда как преобразование типов может быть как неявным , так и явным.

Мы рекомендуем использовать трехсимвольные операторы сравнения (===) вместо двухсимвольных (==), чтобы предотвратить непредвиденные преобразования типов, потому что === просто выполняет сравнение значений и не делает никаких покрытий. Но у оператора === есть нюансы и лучше знать их.

Подробнее о приведении типов:

Бокс и нативные конструкторы

Как примитивные типы в Javascript имеют методы и свойства?

Обертки объектов служат очень важной цели. Примитивные значения не имеют свойств или методов, поэтому для доступа к .length или .toString() вам нужна объектная оболочка вокруг значения. К счастью, JS автоматически упаковывает (обертывает) примитивное значение для выполнения таких обращений.

В общем, нет никаких причин напрямую использовать объектную форму. Лучше просто позволить боксу происходить неявно там, где это необходимо. Другими словами, никогда не делайте таких вещей, как new String(“abc”), new Number(42) и т. д. — всегда предпочитайте использовать литеральные примитивные значения “abc” и 42.

Есть даже подводные камни при непосредственном использовании оберток объектов, о которых вам следует знать, если вы решите когда-либо их использовать.

Например, рассмотрим логические обернутые значения:

Проблема в том, что вы создали оболочку объекта вокруг значения false, но сами объекты являются «истинными», поэтому использование объекта ведет себя противоположно использованию самого базового ложного значения, что совершенно противоречит обычным ожиданиям.

Если у вас есть оболочка объекта и вы хотите получить базовое примитивное значение, вы можете использовать метод valueOf().

Давайте посмотрим на другой пример:

Примечание: с помощью встроенной функции конструктора нативов мы не можем использовать ключевое слово new, для этого у них есть "безопасная" оболочка, но new Date является исключением.

null и undefined не имеют обертки коробки.