Перейти к содержанию

Сильная и слабая типизация

Языки программирования также разделяются на сильно типизированные и слабо типизированные. Очень часто можно услышать их неверные синонимы - строгая типизация и нестрогая типизация. Эти синонимы считаются неверными по той причине, что в англоязычной литературе эти термины звучат как strongly typed и weakly typed, что дословно переводится как сильно типизированные и слабо типизированные.

Сильная типизация

Языки с сильной типизацией (strongly typed) не разрешают выполнение выражений с несовместимыми типами и не выполняют неявное преобразование типов в ситуациях, когда нужно выполнять преобразование явно.

Сильно типизированный язык не позволит такие операции, как умножение числа на массив и не выполнит неявного преобразования объекта к строке.

var multy = (a, b) => a * b

var number = 5
var array = [0, 1, 2]

var result = multy(number, array[2]) // Ок, вернёт 10
var result = multy(number, array) // Ошибка

var welcome = (name) => 'Hello' + ' ' + name

var user = {
  name: 'Bob',
}

var result = welcome(user.name) // Ок, вернёт 'Hello Bob'
var result = welcome(user) // Ошибка

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

К языкам с сильной типизацией можно отнести такие языки, как Java, C# и другие.

Слабая типизация

Языки со слабой типизацией (weakly typed) разрешают выполнение выражений с любыми типами и самостоятельно выполняют неявное преобразование.

Например, в JavaScript при операции сложения строки и числа второй операнд может быть неявно приведён к строке, а при сложении строки и объекта объект будет неявно приведён к значению, возвращаемому объектом из метода toString().

var add = (a, b) => a + b

var results = add(5, 5) // Ок, вернёт 10
var result = add('Hello', 5) // Ошибки не будет, но результат будет Hello5

var welcome = (name) => 'Hello' + ' ' + name

var user = {
  name: 'Bob',
}

var result = welcome(user.name) // Ок, вернёт 'Hello Bob'
var result = welcome(user) // Ошибки не будет, но в результате вернёт 'Hello [object Object]'

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

var valueA = 5 + '5' // Вернёт 55 (string) вместо 10 (number)
var valueB = valueA * 2 // Вернет 110 (number) вместо 20 (number)

К языкам со слабой типизацией относятся JavaScript или PHP.

Итог

  • Сильная типизация не позволяет выполнять выражения с различными типами и не преобразует неявно типы данных, которые нуждаются в явном преобразовании.
  • Слабая типизация, напротив, позволяет выражения с операциями над различными типами данных и выполняет неявные преобразования.