Что такое тип принуждения в Javascript?
Например, при использовании ==
вместо ===
?
Что такое тип принуждения в Javascript?
Например, при использовании ==
вместо ===
?
Тип принуждения означает, что, когда операнды оператора являются разными типами, один из них будет преобразован в "эквивалентное" значение другого типа операнда. Например, если вы выполните:
boolean == integer
логический операнд будет преобразован в целое число: false
становится 0
, true
становится 1. Затем сравниваются два значения.
Однако, если вы используете оператор преобразования без преобразования ===
, такого преобразования не происходит. Когда операнды имеют разные типы, этот оператор возвращает false
и только сравнивает значения, когда они одного типа.
Давайте начнем с короткого ввода, чтобы набрать системы, которые, я думаю, помогут вам понять общую идею тикового принуждения.
Система типов языка определяет правила, которые говорят нам, какие типы данных существуют на этом языке, и как их можно комбинировать с использованием разных операторов. Например, одно из таких правил может указывать, что оператор плюс (+) действует только на числа. Эти правила существуют прежде всего для того, чтобы вы не стреляли в ногу. Но что происходит, когда программист нарушает это правило в программе? Theres ничего не мешает программисту печатать {} + {}
или "hello" + 5
в программе, даже если язык не считает, что эти выражения имеют какой-то смысл.
То, что в конечном итоге происходит в этих ситуациях, зависит от того, насколько строгий язык относится к его правилам типа.
Система типов языков часто содержит одну из двух позиций о том, что вы нарушаете ее правила:
Языки с системами типов, которые занимают первую позицию о своих правилах, в разговорной речи называются "строго типизированными" языками. Они строги, не позволяя вам нарушать его правила. Те, которые принимают второй подход (например, JavaScript), называются "слабо типизированными" или "слабо типизированными" языками. Конечно, вы можете нарушить правила, но не удивляйтесь, когда он преобразует тип данных, которые вы описали в своей программе, с целью соблюдения его правил. Это поведение известно как... (барабанное рулон)... тип принуждения.
Теперь рассмотрим некоторые примеры в JavaScript. Во-первых, давайте начнем с выражения, которое не приведет к типу принуждения.
5 + 5
Использование оператора + с двумя номерами, которые вполне допустимы. Программа будет относиться + к значению "добавить" и с радостью добавить два числа. Преобразование не требуется.
Но как насчет...
[] + 5
О, о. В JavaScript +
может означать добавление двух чисел или объединение двух строк. В этом случае у нас нет ни двух чисел, ни двух строк. У нас есть только одно число и объект. Согласно правилам типа JavaScript это не имеет никакого логического смысла. Поскольку его прощение о том, что вы нарушаете его правила, вместо того, чтобы рушиться, все равно пытается понять это. Итак, что делает JavaScript? Ну, он знает, как конкатенировать строки, поэтому он преобразует как [], так и 5 в строки, а результат - строковое значение "5".
Какова сделка с операторами сравнения ==
и ===
? Почему существуют два оператора сравнения?
==
не защищен от поведения преобразования типов JavaScripts. Выражения, такие как 5 == "5"
, будут оцениваться как истинные, потому что JavaScript попытается преобразовать один из них таким образом, чтобы он сравнивал один и тот же тип данных.
Во многих случаях это нежелательно, потому что вы, вероятно, хотите знать, имеет ли какой-то сравниваемый вами материал другой тип, чтобы вы могли решить, что с ним делать. То, где приходит оператор ===
. Когда вы используете ===
, преобразование типа не будет. Следовательно, выражение 5 === "5"
будет оцениваться как false.
В Python, если вы пытаетесь добавить, скажем, строки и целые числа, вы получите сообщение об ошибке:
>>> "hi" + 10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
Но в JavaScript у вас нет. 10
преобразуется в строку:
> "hi" + 10
"hi10"
"Тип принуждения" - просто причудливое неправильное обозначение для вышеизложенного. На самом деле ни один язык не имеет "типов" в смысле Java или C или других языков с системами статического типа. Как языки рассматривают взаимодействия между различными нестатистическими значениями, является вопросом выбора и соглашения.
позвольте мне объяснить тип принуждения со следующим примером
Type Coercion означает, что Javascript автоматически ("на лету") преобразует переменную из одного типа данных в другой
Пример: 123 + "4"
как правило, вызывает ошибку, но в Javascript из-за принуждения типа он приводит к 1234
строке
if(23 == "23"){
console.log(" this line is inside the loop and is executed ");
}
В приведенном выше коде из-за типа принуждения - JavaScript считает, что 23
(число) и "23"
(строка) - это одно и то же. это делает условие истинным и печатает console.log
В другом случае
if(23 === "23"){
console.log(" this line is inside the loop and is NOT executed");
}
В ===
случае Javascript не выполняет Type Coercion, а поскольку 23
- это число, а "23"
- это String, и из-за ===
эти два типа данных различны и приводят к ложному состоянию. Он не печатает console.log
Простыми словами
В этом случае =
это оператор присваивания, который присваивает значения, такие как var a = 3;
, так далее
(ниже для сравнения)
В этом случае ==
Javascript преобразует/принуждает тип данных к другому, а затем сравнивает его.
В этом случае ===
Javascript не конвертирует и не принуждает тип данных
Во избежание ошибок и для целей отладки ===
в основном используется
Пожалуйста, дайте мне знать точность вышеуказанной информации.
a == b
означает, что javascript будет оценивать a
против b
на основе того, могут ли значения оцениваться одинаково. Например, false == 0
будет оценивать значение true, так как 0 также является значением Boolean false. Тем не менее, false === 0
будет оценивать false, потому что строгое сравнение, 0 - это не то же физическое значение, что и false. Другим примером является false == ''
Так что в основном свободное сравнение против строгого сравнения, потому что javascript - это свободно типизированный язык. Иными словами, javascript будет пытаться преобразовать переменную на основе контекста кода, и это приводит к тому, что вещи становятся равными, если они не будут строго сравниваться. php также имеет такое поведение.
var str = 'dude';
console.log(typeof str); // "string"
console.log(!str); // false
console.log(typeof !str); // "boolean"
Пример переменной, которая изначально объявляется как строка, принудительно вводимая в логическое значение с помощью! Оператор
Если тип данных не равен друг другу, то возникает принуждение. например 3 == "3" или boolen == integer
Тип принуждения в javascript возникает, когда движок Javascript должен выполнить определенную операцию, для которой ему нужны данные определенного типа. Когда двигатель встречает данные определенного типа, которые не применимы для операции, он затем принуждает данные к определенному типу. Это необходимо, потому что переменные в javascript динамически типизируются, что означает, что данной переменной может быть присвоено значение любого типа.
if(1){
// 1 gets coerced to true
}
if(4 > '3') {
// 3 gets coerced into a number
}
44 == "44" // true, the string 44 gets converted to a nr
При принуждении javascript все значения преобразуются в true
за исключением следующих значений, которые принудительно применяются к false
:
console.log(!!""); // false
console.log(!!0); // false
console.log(!!null); // false
console.log(!!undefined); // false
console.log(!!NaN); // false
console.log(!!false); // false