Это называется неявное приведение типов. В первом случае программа видит цифру 5 в кавычках, что означает, что это не число, а просто символ строки, как буква к примеру. Но потом идет минус, чисто арифметический оператор. Как из буквы можно вычесть число? JS пытается привести строку '5' в число, и у него это получается, потому что в строке действительно было число. И на выходе получается 2. В следующем же случае, вместо попытки отнять тройку, ее прибавляют. А во многих языках программирования прибавлять можно и строки тоже, это называется конкатенация, или просто объединение. Так что JS тут просто видит, мол, к строке пытаются прибавить число. Раз первой была строка, то и вторую переменную он преобразует в строку, и получится строка '53', потому что было бы нелогично, если бы он решил преобразовать первую переменную в цифру. В третьем же примере уже просто доведение ситуации до абсурда, сначала идет строка, потом плюс который в случае со строками означает конкатенацию, а следом, внезапно, минус. Ну ок, теперь у нас минус это тоже строка, а значит объединяем ее с предыдущей строкой, и третью туда же засунем.
'5'+-'2'. Возможно минус воспринимается как унарный к '2'. Т.е. 2 становится числом. А дальше имеем аналог 2го случая '5' + (-2).
Проверяется ж элементарно в консоли почти любого браузера:
'5' + - '2'
"5-2"
Неа. Начали со строки, значит, и минус - тоже строка.
Неа. Начали со строки, значит, и минус - тоже строка.ок.
(-2)+ '5' = -25;
-'2' + '5' = -25;
НО!
- '2' - '5' = 7; - первый унарный минус преобразует строку '2' в число, потом, т.к. от числа отнимается строка(а не прибавляется), пытается преобразовать строку в число. получается. выполняет вычитание.
Я бы так не сказал. Я уверен, что можно написать полное говно на языке со строгим синтаксисом, вроде Java, а можно написать шедевр на каком-нибудь PHP. Обычно я вообще не привык обвинять в чем-то языки программирования, и часто их плюсы и минусы слишком уж субъективны. Это просто особенности, которые служат конкретной цели. Ну есть там динамическая типизация и прекрасно. Но вот кое-каких программистов, которые всем этим злоупотребляют и пишут непотребщину, пользуясь лояльностью языка, можно было бы тапком по голове и настучать. Нормальный человек всю эту херню '5' + 3 будет писать только в мемасах, чтобы высмеять. Вот потом и идет ненависть к языку программирования, просто из-за того, что какому-то одному прогеру пришлось разбираться в адском коде другого, всеми возможными словами поминая его мать и вспоминая старые добрые деньки на своем C++
А при чем тут динамическая типизация, если обсуждаемое явление является проявлением нестрогой типизации + уебанского выбора операторов? Во многих языках с динамической типизацией такой проблемы не существует.
Все указанные операции в JavaScript именно так и работают. То есть, '5'-3 действительно там равно 2 и тд. Собственно, нелогичность этих операций на первый взгляд и является солью шутки
целочисленые, строки и тп.
тоесть 5 не равно "5"
5+5=10
"5"+"5"="55"
как то так.
не нужно использовать принудительную смену типа, нужно просто не записывать строки туда где должды быть числа
Ну var уже почти атавизм, сейчас используется let. Не пойму где тут путаться:
let var1 = 42;
let var2 = ‘pikabu’;
let var3 = [1, 2, 3];
Неужели код неочевидный?
Я скорее про то, когда это используется рядом с функцией
let var4 = blabla();
let var5 = bloblo();
let var6 = var4 + var5;
Сможете сказать какого типа var6?
А не надо давать такие названия переменным. К примеру, если функция возвращает `True` или `False`, то и называться она должна что-то типа `isBlabla()`. Так же названия переменных и функций типа `let Name` или `getTitle()` вряд ли будут типа отличного от строчного, а `let Left` и `Sum(a,b)` наверняка будут числовыми. Ну и не должна функция выполнять больше, чем говорит её имя. Если называется допустим `closeForm()`, то она должна только закрыть форму и не должна при этом проверять введённые данные, сохранять их и рисовать 7 перпендикулярных красных линий.
В любом случае, при любой возможности лучше пользоваться TypeScript, крупные проекты на JavaScript - это просто ад.
Спасибо. Теперь я больше знаю про js, хоть никогда не был с ним знаком. Наверное в нем это благополучно вписывается.
Как по мне, так абсолютно бесполезная штука, за тем исключением, если не пишешь на нём весь проект с ноля, который при этом является замкнутым и никак не может расширяться сторонними скриптами.
Если покажите мне, как транспайлировать классы из TypeScript в JS с сохранением приватности полей и методов, я во первых буду крайне признателен, а во вторых соглашусь, что от TS может быть реальная польза. К сожалению на сегодняшний день, TS не умеет превращать свои классы в фабричные функции, а JS ещё сам не имеет окончательно реализованной работы с классами.
JavaScript как раз не тупенький, а вот разработчики которые не проверяют типы переменных не очень умные.
Так исторически сложилось, а так как он встроен в большинство браузеров и есть тысячи сайтов с кодом разной степени окаменелости они стараются не ломать обратную совместимость. Для исправления дизайна и придумали CoffeScript, TypeScript и т.д.
Дизайн отличный, просто когда используют малолитражку вместо трактора получаются такие вот недоразумения.
Есть. Если язык при инждутриальной разработке, где уровень абстракции мышления должен быть уровня класса и выше, заставляет разаработчика постоянно отвлекаться на приведение типов, да еще при этом и не имеет возможности провалидировать решение никак, кроме рантайма - это тупой язык.
'9'+'9' получится 99. потому что плюсом складываются строчки в JS, если их вот так написать 'что-то'.