Что такое приведение типов в JavaScript?

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

Приведение типов может быть полезно, но может вызывать несоответствия.

Возьмем небольшой пример,

Несогласованный результат приведения типов

Пример: 1

Преимущество принуждения типов

В приведенном выше примере мы сравниваем цены двух акций и выводим данные на консоль.

stockAPrice - это число, а stockBPrice - это строка.

В условии if, if (stockAPrice == stockBPrice), мы сравниваем числовое значение и строковое значение.

Для сравнения этих двух значений мы используем двойной знак равенства (==), это сравнение равенства известно как сравнение абстрактного равенства. Абстрактное сравнение выполняется с использованием приведения типов, что означает, что JavaScript попытается автоматически преобразовать тип для получения результата.

В приведенном выше примере JavaScript преобразует строковое значение в числовое значение, а затем выполняет сравнение. Ниже приведен результат выполнения условия if.

Чтобы узнать больше о том, как JavaScript выполняет сравнение абстрактного равенства, пожалуйста, проверьте http://ecma-international.org/ecma-262/5.1/#sec-11.9.3

До сих пор мы видели преимущество приведения типов.

Пример: 2

Непреднамеренное принуждение типа

В приведенном выше фрагменте кода stockAPrice - это число, а stockBPrice - это строка.

Теперь давайте попробуем сложить их, чтобы узнать общий объем инвестиций, если мы решили купить по одному количеству каждой акции.

let totalInvestment = stockAPrice + stockBPrice;

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

В этом случае он преобразует числовое значение в строковое значение (противоположно сравнению равенства), и мы получаем объединенную строку. Мы ожидали прибавления, т.е. totalInvestment = 24.

Как видно из двух приведенных выше примеров, приведение типов приводит к противоречивым результатам.

Как избежать противоречивых результатов приведения типов

Теперь давайте посмотрим, как избежать приведения типов.

Пример: 1

Измените сравнение абстрактного равенства на сравнение равенства Стрика (замените «==» на «===»)

Мы изменили Пример: 1.

stockAPrice - это число, а stockBPrice - это строка.

В условии if, if (stockAPrice === stockBPrice), мы сравниваем числовое значение и строковое значение, но мы заменили «==» на «===».

Для сравнения этих двух значений мы используем знак равенства из рубца (===), это сравнение равенства известно как сравнение строгого равенства. Строгое сравнение вернет истину, только если значения имеют одинаковый тип и равные значения. Ниже приведен результат,

Чтобы узнать больше о том, как выполняется строгое сравнение равенства, пожалуйста, проверьте http://ecma-international.org/ecma-262/5.1/#sec-11.9.6

Пример: 2

Явно преобразовать тип

В приведенном выше фрагменте кода stockAPrice - это число, а stockBPrice - это строка.

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

После явного преобразования ниже выводится,

Мы получили ожидаемый результат, а не конкатенацию.

Вывод:

  • Избегайте «==» и используйте «===». Двойной знак равенства (==) выполняет сравнение абстрактного равенства, а знак тройного равенства (===) выполняет строгое сравнение равенства.
  • Не полагайтесь на автоматическое преобразование типов JavaScript специально при выполнении арифметических операций. При необходимости обеспечивайте явное преобразование типов.
  • Чтобы узнать больше о том, как выполняется сравнение абстрактного равенства, прочтите http://ecma-international.org/ecma-262/5.1/#sec-11.9.3
  • Чтобы узнать больше о том, как выполняется строгое сравнение на равенство, прочтите http://ecma-international.org/ecma-262/5.1/#sec-11.9.6

Спасибо за чтение. Загляните в мой блог здесь.

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