Что такое приведение типов в 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
Спасибо за чтение. Загляните в мой блог здесь.
Пожалуйста, дайте мне знать ваш отзыв или любые предложения по улучшению.