Что такое приведение типов в Javascript?
Например, об использовании ==
вместо ===
?
javascript
gespinha
источник
источник
(true == 1) => true
/(true === 1) => false
.Ответы:
Приведение типов означает, что когда операнды оператора относятся к разным типам, один из них будет преобразован в «эквивалентное» значение типа другого операнда. Например, если вы это сделаете:
логический операнд будет преобразован в целое число:
false
становится0
,true
становится 1. Затем два значения сравниваются.Однако при использовании оператора сравнения
===
без преобразования такое преобразование не происходит. Когда операнды имеют разные типы, этот оператор возвращаетfalse
и сравнивает значения, только если они одного типа.источник
===
когда я хочу сравнить, равно ли одно значение другому?> , <
?Давайте начнем с краткого введения в системы типов, которые, я думаю, помогут вам понять общую идею приведения типов.
Система типов языка определяет правила, которые говорят нам, какие типы данных существуют на этом языке и как их можно комбинировать с помощью различных операторов. Например, одно такое правило может указывать, что оператор плюс (+) действует только с числами. Эти правила существуют в первую очередь для того, чтобы вы не прострелили себе ногу. Но что происходит, когда программист нарушает это правило в программе? Ничто не мешает программисту печатать
{} + {}
или вводить“hello” + 5
программу, даже если язык не считает, что эти выражения имеют какой-либо смысл.Что в конечном итоге происходит в этих ситуациях, зависит от того, насколько язык строг в отношении правил типов.
Система типов языков часто придерживается одной из двух позиций о том, что вы нарушаете ее правила:
Языки с системами типов, которые занимают первое место в отношении правил, в просторечии называются «строго типизированными» языками. Они строги и не позволяют вам нарушать его правила. Те, которые используют второй подход (например, JavaScript), называются «слабо типизированными» или «слабо типизированными» языками. Конечно, вы можете нарушить правила, но не удивляйтесь, когда он принудительно преобразует тип данных, который вы описали в своей программе, в соответствии с его правилами. Такое поведение известно как… (барабанная дробь)… типа принуждения .
Теперь давайте посмотрим на несколько примеров на JavaScript. Во-первых, давайте начнем с выражения, которое не приводит к приведению типов.
Использование оператора + с двумя числами, что совершенно верно. Программа будет рассматривать + как «сложить» и успешно сложить два числа. Преобразование не требуется.
Но что насчет …
Ой ой. В JavaScript это
+
может означать сложение двух чисел или соединение двух строк. В этом случае у нас нет ни двух чисел, ни двух строк. У нас есть только одно число и объект. Согласно правилам типов в JavaScript, это не имеет логического смысла. Поскольку он прощает, что вы нарушаете его правила, вместо того, чтобы разбиться, он все равно пытается разобраться в этом. Так что же делает JavaScript? Что ж, он знает, как объединять строки, поэтому он преобразует как [], так и 5 в строки, и результатом является строковое значение «5».В чем дело с операторами сравнения
==
и===
? Почему есть два оператора сравнения?==
не застрахован от поведения преобразования типов в JavaScript. Выражения, такие как,5 == “5”
будут иметь значение true, потому что JavaScript попытается преобразовать одно из них, чтобы оно сравнивало данные того же типа.Во многих случаях это нежелательно, потому что вы, вероятно, хотите знать, относятся ли некоторые данные, с которыми вы сравниваете, к другому типу, чтобы вы могли решить, что с ними делать. Здесь на
===
помощь приходит оператор. Когда вы его используете===
, преобразование типа не происходит. Следовательно, выражение5 === “5”
будет иметь значение false.источник
В Python, если вы попытаетесь добавить, скажем, строки и целые числа, вы получите ошибку:
Но в JavaScript этого нет.
10
Преобразуется в строку:«Типовое принуждение» - это всего лишь причудливый неправильный термин для вышесказанного. На самом деле ни один язык не имеет «типов» в смысле Java или C или других языков со статическими системами типов. То, как языки обрабатывают взаимодействия между различными нестатически типизированными значениями, является вопросом выбора и соглашения.
источник
позвольте мне объяснить приведение типов на следующем примере
Принуждение типа означает, что Javascript автоматически (на лету) преобразует переменную из одного типа данных в другой.
Пример:
123 + "4"
обычно вызывает ошибку, но в Javascript из-за приведения типов1234
возникает строкаВ приведенном выше коде из-за приведения типов - JavaScript считает
23
(число) и"23"
(строка) одним и тем же. это делает условие истинным и печатает console.logВ другом случае
В
===
случае, если Javascript не выполняет приведение типов, и поскольку23
это число, а"23"
это String, и из-за того, что===
эти два типа данных различны, что приводит к ложному условию. Он не печатает console.logПростыми словами
В данном случае
=
это оператор присваивания, который присваивает такие значения, какvar a = 3;
и т. Д.(ниже операторы для сравнения)
В этом случае
==
Javascript преобразует / приводит один тип данных к другому, а затем сравнивает его.В этом случае
===
Javascript не конвертирует / не принуждает тип данныхВо избежание ошибок и в целях отладки
===
в основном используетсяПожалуйста, дайте мне знать, насколько верна приведенная выше информация.
источник
Что такое принуждение:
Приведение типов в javascript происходит, когда движок Javascript должен выполнить определенную операцию, для которой ему нужны данные определенного типа. Когда механизм встречает данные определенного типа, которые не подходят для операции, он затем переводит данные в определенный тип. Это необходимо, потому что переменные в javascript динамически типизируются, что означает, что данной переменной можно присвоить значение любого типа.
Пример:
Логическое принуждение:
При принуждении javascript все значения преобразуются в,
true
за исключением следующих значений, к которым принудительно приводятсяfalse
:Также обратите внимание, что в приведенном выше примере двойная! используется оператор. ! Оператор mark переводит значение в логическое значение с противоположным значением. Мы можем использовать этот оператор дважды, чтобы преобразовать любое значение в логическое.
источник
a == b
означает, что javascript будет оцениватьa
наb
основе того, могут ли значения быть оценены одинаково. Например,false == 0
будет оцениваться значение true, потому что 0 также является значением логического false. Однакоfalse === 0
будет оцениваться false, потому что строго сравнивая, 0 не то же самое физическое значение, что false. Другой пример: вfalse == ''
основном свободное сравнение против строгого, потому что javascript - это слабо типизированный язык. То есть javascript будет пытаться преобразовать переменную в зависимости от контекста кода, и это приведет к уравниванию значений, если они не будут строго сравниваться. php также имеет такое поведение.источник
0 is not the same physical value as false
, ИМО физическиfalse
точно0
в памяти. Я бы сказал, что они разные по типу, такfalse
как логическое значение, а0
целое число.Приведение типов - это процесс преобразования значения из одного типа в другой (например, строки в число, объект в логическое и т. Д.). Любой тип, будь то примитив или объект, является допустимым объектом для приведения типов. Напомним, примитивы: число, строка, логическое значение, null, undefined + символ (добавлено в ES6).
Неявное и явное принуждение. Принуждение типа может быть явным и неявным.
Когда разработчик выражает намерение выполнить преобразование между типами, написав соответствующий код, например
Number(value)
, это называется явным приведением типа (или приведением типа).Поскольку JavaScript является языком со слабой типизацией, значения также могут автоматически преобразовываться между разными типами, и это называется неявным приведением типов. Обычно это происходит , когда вы применяете операторы значений различных типов, как
1 == null
,2/’5'
,null + new Date()
или он может быть вызван окружающим контекстом, как и сif (value) {…}
, где значением приводятся к булева.Один оператор, который не запускает неявное приведение типа
===
, называется оператором строгого равенства. С==
другой стороны, оператор свободного равенства выполняет как сравнение, так и приведение типов, если это необходимо.Неявное приведение типов - это обоюдоострый меч: это отличный источник разочарований и дефектов, но также и полезный механизм, позволяющий писать меньше кода без потери читабельности.
Три типа преобразования . Первое правило, которое необходимо знать, - в JavaScript есть только три типа преобразования:
Во-вторых, логика преобразования примитивов и объектов работает по-разному, но и примитивы, и объекты могут быть преобразованы только этими тремя способами.
Начнем сначала с примитивов.
Преобразование строки
Чтобы явно преобразовать значения в строку, примените функцию String (). Неявное принуждение запускается бинарным оператором +, когда любой операнд является строкой:
Все примитивные значения преобразуются в строки естественным образом, как и следовало ожидать:
Преобразование символов немного сложно, потому что оно может быть преобразовано только явно, но не неявно.
Логическое преобразование
Чтобы явно преобразовать значение в логическое, примените
Boolean()
функцию. Неявное преобразование происходит в логическом контексте или запускается логическими операторами (|| && !
).Примечание. Логические операторы, такие как
|| and &&
внутренние логические преобразования, фактически возвращают значение исходных операндов, даже если они не являются логическими.Поскольку есть только 2 возможных результата логического преобразования: истина или ложь, проще запомнить список ложных значений.
Любое значение , которое не входит в список преобразуется в
true
том числеobject
,function
,Array
,Date
, определяемого пользователем типа, и так далее. Символы - истинные ценности. Пустой объект и массивы также являются истинными значениями:Числовое преобразование
Для явного преобразования просто примените
Number()
функцию, как и сBoolean()
иString()
.Неявное преобразование сложно, потому что оно запускается в большем количестве случаев:
операторы сравнения (>, <, <=,> =)
побитовые операторы (| & ^ ~)
арифметические операторы (- + * /%). Обратите внимание, что двоичный + не запускает числовое преобразование, если любой операнд является строкой.
унарный + оператор
оператор свободного равенства == (включая! =).
Обратите внимание, что == не запускает числовое преобразование, если оба операнда являются строками.
Number ('123') // явный + '123' // неявный 123! = '456' // неявный 4> '5' // неявный 5 / null // неявный true | 0 // неявный
Вот как примитивные значения преобразуются в числа:
источник
Пример переменной, которая изначально объявлена как строка, преобразованная в логическое значение с помощью! оператор
источник
Приведение типов - это процесс преобразования значения из одного типа в другой (например, строки в число, объект в логическое и т. Д.). Любой тип, будь то примитив или объект, является допустимым объектом для приведения типов. Напомним, примитивы: число, строка, логическое значение, null, undefined + символ (добавлено в ES6).
Приведение типов может быть явным и неявным.
Когда разработчик выражает намерение выполнить преобразование между типами, написав соответствующий код, например Number (значение), это называется явным приведением типа (или приведением типа).
Поскольку JavaScript является языком со слабой типизацией, значения также могут автоматически преобразовываться между разными типами, и это называется неявным приведением типов. Обычно это происходит, когда вы применяете операторы к значениям разных типов, например 1 == null, 2 / '5', null + new Date (), или это может быть вызвано окружающим контекстом, например, с if (value) {… }, где значение приводится к логическому.
вот пример неявного приведения типа:
подробнее: https://www.freecodecamp.org/news/js-type-coercion-explained-27ba3d9a2839/
источник
Если типы данных не равны друг другу, то происходит принуждение. например 3 == "3" или логическое == целое число
источник