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

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

Сильная типизация (strongly typed)

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

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

ts
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(), то есть строке.

ts
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]'

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

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

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