Взгляните на 5 вещей в JavaScript, о которых не знают 90% разработчиков!

Непонимание примитивных типов

В JavaScript все является объектом!

Многие из вас, вероятно, слышали это утверждение раньше. Для этого утверждения есть причина, но оно ЛОЖНО. Кстати, FALSE - отличный пример одного из тех значений, которые не являются объектом. Большинство значений могут вести себя как объект, и поэтому разработчики говорят, что все является объектом. Да, они могут вести себя как объекты, но это не объекты! Угадайте, я читал спецификации.

Согласно ECMAScript, у нас есть 7 типов ECMAScript: undefined, null, boolean, string. , символ (функция ECMAScript 6), число и объект. Мы иногда называем их примитивным типом (исключить тип объекта из этой группы - подробнее об объектах в следующей части).

Первый тип - undefined. Как мы можем догадаться, у него есть только одно возможное значение - undefined. Также есть тип строка. Это простая примитивная строка (отличается от объекта String в C ++ или C #). Мы создаем их двойным / одинарным цитированием ряда символов. Число (подробнее о сложных деталях позже) - это примитивный тип в JavaScript и ссылки на все числа. Тип boolean имеет два возможных значения - true или false… True и false - это другие значения JS, они особенные и ведут себя по-разному. Объект - это еще один тип, у которого есть свои подтипы. Символы - это «новый» тип, который используется редко. Он имеет мощное свойство Symbol.iterator, которое используется циклом for..of.

Вывод: Что-то может вести себя как объект, но это не делает его объектом.

Как бороться с undefined?

Неопределенное и необъявленное - это одно и то же ?!

Как мы можем описать undefined? Это что за вид или что? Нельзя сказать, что это тип, в спецификации этого тоже не сказано. Он ведет себя как тип, поэтому разработчики скажут: это тип!

А как насчет неопределенных и необъявленных? Они одинаковы. Да, на английском, но не на JavaScript. В JavaScript это две совершенно разные концепции. Если мы попробуем:

Почему JS возвращает undefined, если его не существует? JavaScript игнорирует эту нелогичность. Отсутствие декларации - не большая проблема в JS - это вообще не проблема. Почему это так? Историческая причина, наверное. Необъявленный означает, что он никогда не создавался в какой-либо области, к которой у нас есть доступ, но неопределенное означает, что в данный момент существует переменная без значения.

Доказательство? Оператор typeof - единственный оператор, который может ссылаться на несуществующий объект и не вызывать ошибку!

Переменные можно не инициализировать!

Неинициализированные и неопределенные - это одно и то же ?!

В JS есть три концепции вакуума. Третий - неинициализированный! Это было введено в ES6. Это еще одно состояние переменной. Мы также назвали это Временная мертвая зона - ТДЗ.

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

Масштабирование целых чисел с помощью BigInt

BigInt - это новый примитив, который обеспечивает способ представления целых чисел, превышающих 2 ^ 53, что является наибольшим числом, которое JavaScript может надежно представить с помощью примитива Number.

BigInt - это примитивный тип. Назначьте BigInt - - это не просто число, это число в пространстве, где оно может увеличиваться до бесконечности, вплоть до объема памяти в системе. По сути, у нас может быть целое число, которое бесконечно растет. Это отдельная концепция, это не число, как другие числа в JavaScript. BigInt и обычное число не имеют одного и того же места в памяти, они разделены. Попробуйте использовать операцию typeof в BigInt. Результат? Typeof вернет bigint.

NaN против isNaN

NaN - это не число?

Есть особые ценности, на которые стоит обратить внимание. У нас есть две особые ценности, и они могут доставить много головной боли. Давайте углубимся в первый тип, который называется NaN (не числом). Что говорят спецификации, является ли NaN числом? Да, это так. В этом случае буквально больше не значит буквально! Это означает, что это специальное контрольное значение, которое указывает на недопустимый номер. Если у нас есть ситуация:

Несмотря на то, что это недопустимое число NaN, оно не равно самому себе, согласно оператору тройного равенства, оно не равно самому себе. Почему это так? Потому что стандарт IEEE говорит об этом. NaN - единственное значение в JavaScript, у которого нет свойства identity (не равно самому себе).

Еще раз: это происходит потому, что IEEE сказал, что NaN не равны друг другу. Фактически, NaN - единственное существующее значение, по крайней мере, в JavaScript, это единственное значение, у которого нет того, что мы называем свойством идентичности, то есть оно не равно самому себе.

Но вот в чем хитрость. Когда мы передаем значение NaN (это строка), мы получаем true:

А что насчет этой строки кода? Я передаю простую строку, которая не является числом. По какой-то причине JS всегда приводит значения к числам, прежде чем проверять их на NaN. Таким образом, он сначала будет приведен к значению NaN, а isNaN (NaN) будет истинным. В ES6 они добавляют лучшую полезность. Number.isNaN - это утилита, которая расскажет нам правду:

Другими словами, никакого принуждения нет. Он говорит нам, что это именно номер. NaN - это часть спецификации числового представления. В конце концов, какой тип NaN? Это число.

Вывод: Не думайте о NaN как о не числовом типе, считайте NaN недействительным числом!

Хотите прочитать следующую часть? Щелкните здесь!

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