Привет, коллеги-исследователи JavaScript! Угадайте, откуда я пишу эту статью? Да, вы правильно догадались - зал ожидания! В моей машине ремонтируют рулевую рейку, и вы не поверите, какую связь я нашел между этим и безумным принуждением JavaScript.

Рулевая рейка превратилась во что-то совершенно неожиданное, прямо как преобразования типов в JavaScript! И позвольте мне сказать вам, что я не смог управлять им, как и некоторые из моих кодов JavaScript.

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

Неявное и явное принуждение

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

Number();
String();
Boolean();

Приведение строки

Приведение строк преобразует другие типы данных, такие как числа и логические значения, в строки. Часто наблюдается при объединении данных оператором +. Например,

//following will implicitly convert the number 25 into a string.
console.log("Age: " + 25)

//Age 25

Числовое принуждение

Числовое принуждение преобразует строки и логические значения в числа. При использовании арифметических операций, таких как  (-) (/) или (*), JavaScript неявно приводит значения к числам. Например, посмотрите на следующие операции.

("50"-10)
//40

(50-"10")
//40

("50"/10)
//5

(50/"10")
//5

("10"*5)
//50

(10*"5")
//50

Поведение унарного плюса (+)

Унарный плюс (+) ведет себя иначе. Если соседние операнды являются числами, плюс (+) добавит их, но если какой-либо из операндов является строкой, JavaScript принудит другой к строке.

Посмотрите на два примера ниже.

("40"+10)
//"4010"

(40+"10")
//"4010"

Когда имеется более двух операндов, мы можем видеть, как JavaScript оценивает первые два операнда, а затем оценивает результат первых двух со следующим… и так далее. Посмотрите на примеры ниже.

("40"+10+10)
//"401010"

Этапы оценки следующие

  1. 40 + 10 = 4010
  2. 4010 + 10 = 401010
(40+10+"10")
//"5010"

Этапы оценки следующие

  1. 40 + 10 = 50
  2. 50 + “10” = “5010”

Точно так же мы получим «502030» из следующей операции.

(40+10+"20"+30)
//"502030"

Принуждение с помощью логических сравнений

Логические операции также включают принуждение. Во время сравнений JavaScript пытается преобразовать операнды в общий тип перед вычислением выражения:

(10 == "10")
//true

("10" == 10)
//true


("10" == "10")
//true


(10 == 10)
//true

Истинное и ложное принуждение

Истинное и ложное принуждение преобразует любое значение в соответствующее ему логическое представление (истинное или ложное).

Следующие значения в JavaScript являются ложными.

  • false: логическое значение «false».
  • 0: ноль (как 0, так и -0).
  • "": пустая строка.
  • null: обозначает отсутствие какого-либо значения.
  • undefined: представляет переменную без присвоенного значения.
  • NaN: обозначает "не число" и представляет собой недопустимую арифметическую операцию.
if (0) {
  // This block won't execute due to falsy coercion
}
if ('') {
  // This block won't execute due to falsy coercion
}

Все остальные значения являются истинными и будут приведены к истинным.

if ("hello") {
  // This block will execute due to truthy coercion
}

if (" ") {
  // This block will execute due to truthy coercion
}

Лучшие практики принуждения

Оператор свободного равенства JavaScript (==) выполняет приведение при сравнении двух значений разных типов. Это может привести к неожиданным результатам, поскольку оператор пытается сделать значения сопоставимыми, приведя их к общему типу. Лучше использовать оператор строгого равенства (===), чтобы избежать непреднамеренного принуждения.

Чтобы написать надежный и поддерживаемый код, всегда стремитесь к явному принуждению, когда это возможно. Это делает ваши намерения понятными другим разработчикам и снижает вероятность неожиданного поведения. Например, используйте Number() для преобразования строки в число или String() для явного преобразования значения в строку.

Когда наша рулевая рейка наконец-то залатана, и я прощаюсь с комнатой ожидания, я не могу не почувствовать новую признательность за причудливое принуждение JavaScript. Наше путешествие в царство преобразований типов было не чем иным, как захватывающим! Мы научились ориентироваться по дорогам неявного и явного принуждения, оттачивая свои навыки, чтобы направлять наш код в правильном направлении.

Удачного кодирования!