в си нестрогая, но статическая - 99.9% косяков вылезет на этапе компиляции.
В каком-нибудь питоне динамическая, но строгая. При сложении числа со строкой будет эксепшн.
А когда все делается автоматически и динамически, уследить за преобразованиями очень сложно
Зло - отсутствие интеллекта. Если где-то в глубине программы вместо числа появляется строка - проблема не в языке, а в плохом навыке у программиста. За входными параметрами и переполнением нужно следить на любом языке, просто ошибки в каждом будут проявляться по разному. Г*внокодер будет одинакового гадить как на c, так и на js.
В си легко выстрелить себе в ногу, используя динамическую память. Это означает особенность дизайна языка, а не то, что на си пишут только те, кто не разбирается в устройстве памяти.
В том же питоне скрипт может вылететь после трёх суток расчетов потому, что перед одной строчкой 7 пробелов, а не 8 (утрирую, на самом деле выдаст ошибку при парсинге перед исполнением, но не суть). Это ошибка программиста, но язык увеличил ее вероятность
Я вообще не очень понял, зачем так было сделано. В каких случаях настрогая динамическая типизация дает какие-то ощутимые бонусы? Когда пишешь вот такое?
return 'The answer is: ' + answer + '.';
Так вроде все уже пишут
return `The answer is ${answer}.`;
а в этом случае, как я понимаю, строгая типизация будет нормально работать (по крайней мере, в Питоне работает). И в чем прикол?
А конструкция во втором выражении как раз создана на такой случай. Использование string interpolation (в julia это так называется, в других языках мб иначе) гораздо безопаснее. В худшем случае программа напечатает дефолтное строковое представление объекта и продолжит работу, а не вылетит с ошибкой или не сделает 9 + '9' = '99'
В первом случае не будет, будет эксепшн, что оператор + не определен для строки и типа переменной answer, если это не строка.Мы же про JS сейчас, а не про Питон? Там прекрасно все сработает, он приведет answer к строке и все сконкатенирует.
Там, где в JS ты пишешь две строчки вида
obj = JSON.parse(response);
console.alert(obj.doc.info[0].caption);
В строго типизированных языках ты или будешь писать дичь вида
console.alert((String) ((Map<?, ?>) ((List<?>) ((Map<?, ?>) obj.get("doc")).get("info")).get(0)).get("caption"))
или писать 50 DTO-классов, чтобы какой-нибудь jackson промаппил всю эту лабуду.
С первым подходом всё проще и быстрей. Зато всё ломается хрен пойми где, когда делают изменения. Со вторым подходом писанины больше, но и порядка в итоге больше.
Понятно, что и во втором случае нагомнокодить никто не запрещает и в первом случае можно делать всё грамотно.
А Python от JS в этом плане мало отличается. Всякие там неявные преобразования из строки в число это просто историческая дурость, которую когда-то сделали и убрать уже невозможно.